<?php

require_once "../config.php";

class User
{
	private $id;
	private $email;
	private $pwd_hash;
	private $surname;
	private $first_name;
	private $birth_date;
	private $gender;
	private $address;
	private $postal_code;
	private $city;
	private $country;
	private $phone_number;
	private $school;
	private $class;
	private $responsible_name;
	private $responsible_phone;
	private $responsible_email;
	private $description;
	private $role;
	private $team_id;
	private $year;
	private $confirm_email;
	private $forgotten_password;
	
	private function __construct() {}

	public static function fromId($id)
	{
		global $DB;
		$req = $DB->prepare("SELECT * FROM `users` WHERE `id` = ?;");
		$req->execute([htmlspecialchars($id)]);
		$data = $req->fetch();

		if ($data === false)
			throw new InvalidArgumentException("L'utilisateur spécifié n'existe pas.");

		$user = new User();
		$user->fill($data);
		return $user;
	}

	public static function fromEmail($email)
	{
		global $DB, $YEAR;
		$req = $DB->prepare("SELECT * FROM `users` WHERE `email` = ? AND `year` = $YEAR;");
		$req->execute([htmlspecialchars($email)]);
		$data = $req->fetch();

		if ($data === false)
			throw new InvalidArgumentException("L'utilisateur spécifié n'existe pas.");

		$user = new User();
		$user->fill($data);
		return $user;
	}
	
	private function fill($data)
	{
		$this->id = $data["id"];
		$this->email = $data["email"];
		$this->pwd_hash = $data["pwd_hash"];
		$this->surname = $data["surname"];
		$this->first_name = $data["first_name"];
		$this->birth_date = $data["birth_date"];
		$this->gender = $data["gender"];
		$this->address = $data["address"];
		$this->postal_code = $data["postal_code"];
		$this->city = $data["city"];
		$this->country = $data["country"];
		$this->phone_number = $data["phone_number"];
		$this->school = $data["school"];
		$this->class = $data["class"];
		$this->responsible_name = $data["responsible_name"];
		$this->responsible_phone = $data["responsible_phone"];
		$this->responsible_email = $data["responsible_email"];
		$this->description = $data["description"];
		$this->role = Role::fromName($data["role"]);
		$this->team_id = $data["team_id"];
		$this->year = $data["year"];
		$this->confirm_email = $data["confirm_email"];
		$this->forgotten_password = $data["forgotten_password"];
	}

	public function getEmail()
	{
		return $this->email;
	}

	public function setEmail($email)
	{
		global $DB;
		$this->email = $email;
		$DB->prepare("UPDATE `users` SET `email` = ? WHERE `id` = ?;")->execute([$email, $this->getId()]);
	}

	public function getId()
	{
		return $this->id;
	}

	public function checkPassword($password)
	{
		return password_verify($password, $this->pwd_hash);
	}

	public function setPassword($password)
	{
		$this->setPasswordHash(password_hash($password, PASSWORD_BCRYPT));
	}

	private function setPasswordHash($password_hash)
	{
		global $DB;
		$this->pwd_hash = $password_hash;
		$DB->prepare("UPDATE `users` SET `pwd_hash` = ? WHERE `id` = ?;")->execute([$password_hash, $this->getId()]);
	}

	public function getSurname()
	{
		return $this->surname;
	}

	public function setSurname($surname)
	{
		global $DB;
		$this->surname = $surname;
		$DB->prepare("UPDATE `users` SET `surname` = ? WHERE `id` = ?;")->execute([$surname, $this->getId()]);
	}

	public function getFirstName()
	{
		return $this->first_name;
	}

	public function setFirstName($first_name)
	{
		global $DB;
		$this->first_name = $first_name;
		$DB->prepare("UPDATE `users` SET `first_name` = ? WHERE `id` = ?;")->execute([$first_name, $this->getId()]);
	}

	public function getBirthDate()
	{
		return $this->birth_date;
	}

	public function setBirthDate($birth_date)
	{
		global $DB;
		$this->birth_date = $birth_date;
		$DB->prepare("UPDATE `users` SET `birth_date` = ? WHERE `id` = ?;")->execute([$birth_date, $this->getId()]);
	}

	public function getGender()
	{
		return $this->gender;
	}

	public function setGender($gender)
	{
		global $DB;
		$this->gender = $gender;
		$DB->prepare("UPDATE `users` SET `email` = ? WHERE `id` = ?;")->execute([$gender, $this->getId()]);
	}

	public function getAddress()
	{
		return $this->address;
	}

	public function setAddress($address)
	{
		global $DB;
		$this->address = $address;
		$DB->prepare("UPDATE `users` SET `address` = ? WHERE `id` = ?;")->execute([$address, $this->getId()]);
	}

	public function getPostalCode()
	{
		return $this->postal_code;
	}

	public function setPostalCode($postal_code)
	{
		global $DB;
		$this->postal_code = $postal_code;
		$DB->prepare("UPDATE `users` SET `postal_code` = ? WHERE `id` = ?;")->execute([$postal_code, $this->getId()]);
	}

	public function getCity()
	{
		return $this->city;
	}

	public function setCity($city)
	{
		global $DB;
		$this->city = $city;
		$DB->prepare("UPDATE `users` SET `city` = ? WHERE `id` = ?;")->execute([$city, $this->getId()]);
	}

	public function getCountry()
	{
		return $this->country;
	}

	public function setCountry($country)
	{
		global $DB;
		$this->country = $country;
		$DB->prepare("UPDATE `users` SET `country` = ? WHERE `id` = ?;")->execute([$country, $this->getId()]);
	}

	public function getPhoneNumber()
	{
		return $this->phone_number;
	}

	public function setPhoneNumber($phone_number)
	{
		global $DB;
		$this->phone_number = $phone_number;
		$DB->prepare("UPDATE `users` SET `phone_number` = ? WHERE `id` = ?;")->execute([$phone_number, $this->getId()]);
	}

	public function getSchool()
	{
		return $this->school;
	}

	public function setSchool($school)
	{
		global $DB;
		$this->school = $school;
		$DB->prepare("UPDATE `users` SET `school` = ? WHERE `id` = ?;")->execute([$school, $this->getId()]);
	}

	public function getClass()
	{
		return $this->class;
	}

	public function setClass($class)
	{
		global $DB;
		$this->class = $class;
		$DB->prepare("UPDATE `users` SET `class` = ? WHERE `id` = ?;")->execute([$class, $this->getId()]);
	}

	public function getResponsibleName()
	{
		return $this->responsible_name;
	}

	public function setResponsibleName($responsible_name)
	{
		global $DB;
		$this->responsible_name = $responsible_name;
		$DB->prepare("UPDATE `users` SET `responsible_name` = ? WHERE `id` = ?;")->execute([$responsible_name, $this->getId()]);
	}

	public function getResponsiblePhone()
	{
		return $this->responsible_phone;
	}

	public function setResponsiblePhone($responsible_phone)
	{
		global $DB;
		$this->responsible_phone = $responsible_phone;
		$DB->prepare("UPDATE `users` SET `responsible_phone` = ? WHERE `id` = ?;")->execute([$responsible_phone, $this->getId()]);
	}

	public function getResponsibleEmail()
	{
		return $this->responsible_email;
	}

	public function setResponsibleEmail($responsible_email)
	{
		global $DB;
		$this->responsible_email = $responsible_email;
		$DB->prepare("UPDATE `users` SET `responsible_email` = ? WHERE `id` = ?;")->execute([$responsible_email, $this->getId()]);
	}

	public function getDescription()
	{
		return $this->description;
	}

	public function setDescription($desc)
	{
		global $DB;
		$this->description = $desc;
		$DB->prepare("UPDATE `users` SET `description` = ? WHERE `id` = ?;")->execute([$desc, $this->getId()]);
	}

	public function getRole()
	{
		return $this->role;
	}

	public function setRole($role)
	{
		global $DB;
		$this->role = $role;
		/** @noinspection PhpUndefinedMethodInspection */
		$DB->prepare("UPDATE `users` SET `email` = ? WHERE `id` = ?;")->execute([$role->getName(), $this->getId()]);
	}

	public function getTeamId()
	{
		return $this->team_id;
	}

	public function setTeamId($team_id)
	{
		global $DB;
		$this->team_id = $team_id;
		$DB->prepare("UPDATE `users` SET `team_id` = ? WHERE `id` = ?;")->execute([$team_id, $this->getId()]);
	}

	public function getYear()
	{
		return $this->year;
	}

	public function getConfirmEmailToken()
	{
		return $this->confirm_email;
	}

	public function setConfirmEmailToken($token)
	{
		global $DB;
		$this->confirm_email = $token;
		$DB->prepare("UPDATE `users` SET `confirm_email` = ? WHERE `id` = ?;")->execute([$token, $this->getId()]);
	}

	public function getForgottenPasswordToken()
	{
		return $this->forgotten_password;
	}

	public function setForgottenPasswordToken($token)
	{
		global $DB;
		$this->forgotten_password = $token;
		$DB->prepare("UPDATE `users` SET `forgotten_password` = ? WHERE `id` = ?;")->execute([$token, $this->getId()]);
	}
}