<?php

namespace SHServ;
use \SHServ\Entities\Session;
use \SHServ\Entities\User;

class Sessions {
	protected $auth_user_instance;
	protected $current_session_instance;
	protected $table_name = "sessions";

	public function create(Int $uid) {
		$token = uniqid($uid . time());
		$result = app() -> thin_builder -> insert($this -> table_name, [
			"uid" => $uid,
			"token" => $token,
			"create_at" => date("Y-m-d H:i:s")
		]);

		return $result ? $token : false;
	}

	public function close($token) {
		$session = $this -> get_session_by_token($token);
		if(!$session) {
			return false;
		}

		$session -> set("status", 2);
		return $session -> update();
	}

	public function close_current_session() {
		return $this -> close($this -> get_auth_token());
	}

	public function set_session(String $token) {
		setcookie("auth_token", $token, time() + 3600 * 24 * 30, "/");
	}

	public function init_session(Int $uid) {
		$token = $this -> create($uid);
		
		if($token){
			$this -> set_session($token);
		}

		return $token;
	}

	public function is_auth() {
		return $this -> get_current_session() ? true : false;
	}

	public function get_auth_token() {
		return isset($_COOKIE["auth_token"]) ? $_COOKIE["auth_token"] : null;
	}

	public function auth_user() {
		if(!$this -> get_auth_token()) {
			return null;
		}

		if(!$this -> auth_user_instance) {
			$session = $this -> get_current_session();
			if(!$session){
				return null;
			}

			$this -> auth_user_instance = new User($session -> get("uid"));
		}

		return $this -> auth_user_instance;
	}

	public function get_current_session() {
		if(!$this -> current_session_instance){
			$token = $this -> get_auth_token();
			if(!$token) {
				return null;
			}

			$this -> current_session_instance = $this -> get_session_by_token($token);
			if($this -> current_session_instance){
				$this -> current_session_instance -> set("last_using_at", date("Y-m-d H:i:s")) -> update();
			}
		}

		return $this -> current_session_instance;
	}

	public function get_session_by_token(String $token) {
		$result = app() -> thin_builder -> select(
			Session::$table_name,
			Session::get_fields(),
			[ 
				["token", "=", $token],
				"AND",
				["status", "=", 1]
			]
		);

		if(!$result) {
			return null;
		}

		return new Session(intval($result[0]["id"]), $result[0]);
	}
}