<?php

namespace api\user;

use Firebase\JWT\JWT;
use PDO;
use function api\utils\dbConn;
use function api\utils\getSAMLSettings;
use function api\utils\getSecretKey;

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

/**
 * User Class
 * Define all functions which either check, update or delete userData data
 */
class userData
{
    /**
     * Check if userData exists and can be logged in
     * @param $username string - Username
     * @param $password string - Password
     * @return bool - True if logged in, false if not
     */
    public 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
     */
    public function createToken(string $username): string
    {
        $now = time();
        $future = strtotime('+2 day', $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
     */
    public 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 userData
     * @param $email - email address of the userData
     * @return string - verification code
     */
    public 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, userData-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
     */
    public 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;
    }

    /**
     * Get the SAML settings
     * @return array - SAML settings
     */
    public function getSamlConf(): array
    {
        return getSAMLSettings();
    }

    /**
     * Check if the SAML user exists
     * @param string $username - Username
     * @param string $email - Email
     * @return bool - True if the user exists, false if not
     */
    public function checkSAMLUser(string $username, string $email): bool
    {
        $conn = dbConn();
        $stmt = $conn->prepare("SELECT * FROM users WHERE username = :username AND email = :email");
        $stmt->bindParam(":username", $username);
        $stmt->bindParam(":email", $email);
        $stmt->execute();

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

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


}