<?php
namespace api\user;
use Firebase\JWT\JWT;
use PDO;

require_once __DIR__ . "/../utils/config.php";

/**
 * User Class
 * Define all functions which either check, update or delete user data
 */
class user
{
    /**
     * Check if user exists and can be logged in
     * @param $username string - Username
     * @param $password string - Password
     * @return bool - True if logged in, false if not
     */
    function checkUser(string $username, string $password): bool
    {
        $conn = dbConn();
        $stmt = $conn->prepare("SELECT * FROM users WHERE username = :username");
        $stmt->bindParam(":username", $username);
        $stmt->execute();
        
        // set the resulting array to associative
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        if ($result)
        {
            if (password_verify($password, $result[0]["password"]))
            {
                return true;
            }
            return false;
        }
        return false;
    }

    /**
     * Create a JWT token
     * @param $username string - Username
     * @return string - JWT token
     */
    function createToken(string $username): string
    {
        $now = time();
        $future = strtotime('+6 hour',$now);
        $secretKey = getSecretKey();
        $payload = [
            "jti"=>$username,
            "iat"=>$now,
            "exp"=>$future
        ];

        return JWT::encode($payload,$secretKey,"HS256");
    }

    /**
     * Check if email is already in use
     * @param string $email - Email to check
     * @return bool - True if email exists, false if not
     */
    function checkEmail(string $email): bool
    {
        $conn = dbConn();
        $stmt = $conn->prepare("SELECT * FROM users WHERE email = :email");
        $stmt->bindParam(":email", $email);
        $stmt->execute();

        // set the resulting array to associative
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        if ($result)
        {
            return true;
        }
        return false;
    }

    /**
     * Send a verification email to the user
     * @param $email - email address of the user
     * @return string - verification code
     */
    function sendResetEmail($email): string
    {
        //generate a random token and email the address
        $token = uniqid("rpe-");
        $headers1 = "From: noreply@rohitpai.co.uk\r\n";
        $headers1 .= "MIME-Version: 1.0\r\n";
        $headers1 .= "Content-Type: text/html; charset=UTF-8\r\n";
        
        $message = "
        <!doctype html>
        <html lang='en'>
        <head>
        <meta charset='UTF-8'>
        <meta name='viewport' content='width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0'>
                 <meta http-equiv='X-UA-Compatible' content='ie=edge'>
        <title>Document</title>
        </head>
        <body>
            <h1>Reset Password Verification Code</h1>
            <br>
            <p>Please enter the following code to reset your password: $token</p>            
        </body>
        </html>
        ";
        
        mail($email, "Reset Password Verification Code", $message, $headers1);
        return $token;
    }

    /**
     * Change password for an email with new password
     * @param $email string Email
     * @param $password string Password 
     * @return bool - true if the password was changed, false if not
     */
    function changePassword(string $email, string $password): bool
    {
        $conn = dbConn();
        $stmt = $conn->prepare("UPDATE users SET password = :password WHERE email = :email");
        $newPwd = password_hash($password, PASSWORD_BCRYPT);
        $stmt->bindParam(":password", $newPwd);
        $stmt->bindParam(":email", $email);
        
        if ($stmt->execute())
        {
            return true;
        }
        return false;
    }


}