<?php
require_once __DIR__ . '/../models/User.php';
require_once __DIR__ . '/../config/jwt.php';
require_once __DIR__ . '/../helpers/Response.php';
require_once __DIR__ . '/../helpers/Validator.php';

class AuthController
{
    private $db;
    private $user;

    public function __construct($db)
    {
        $this->db = $db;
        $this->user = new User($db);
    }

    public function register()
    {
        $input = file_get_contents("php://input");
        $data = json_decode($input, true);

        if ($data === null && !empty($input)) {
            Response::error("Dados de entrada inválidos. Certifique-se de que é um JSON válido.", 400);
            return;
        }

        if (empty($data)) {
            Response::error("Os dados de registo são obrigatórios.", 400);
            return;
        }

        $rules = [
            'name' => 'required',
            'phone' => 'required',
            'password' => 'required|min:6'
        ];

        $errors = Validator::validate($data, $rules);

        if (!empty($errors)) {
            Response::error("Validation Error", 400, $errors);
        }

        $this->user->name = $data['name'];
        $this->user->phone = $data['phone'];
        $this->user->email = $data['email'] ?? null;
        $this->user->password = password_hash($data['password'], PASSWORD_BCRYPT);
        $this->user->role = $data['role'] ?? 'guest'; // Default to guest for the new flow

        // Check if phone already exists
        if ($this->user->phoneExists()) {
            Response::error("Este número de telemóvel já está registado.", 400);
            return;
        }

        if ($this->user->create()) {
            // Automatically log in the user after registration
            $token = base64_encode($this->user->id . ":" . bin2hex(random_bytes(8)));

            Response::success("Utilizador registado com sucesso.", [
                "token" => $token,
                "user_id" => (int) $this->user->id,
                "name" => $this->user->name,
                "role" => $this->user->role,
                "profile_photo_url" => null // New users don't have a photo yet
            ]);
        } else {
            Response::error("Não foi possível registar o utilizador.", 503);
        }
    }

    public function login()
    {
        $input = file_get_contents("php://input");
        $data = json_decode($input, true);

        if ($data === null && !empty($input)) {
            Response::error("Dados de entrada inválidos. Certifique-se de que é um JSON válido.", 400);
            return;
        }

        $identifier = $data['identifier'] ?? $data['email'] ?? $data['phone'] ?? null;
        $password = $data['password'] ?? null;

        if (!$identifier || !$password) {
            Response::error("Identificador e palavra-passe são obrigatórios.", 400);
            return;
        }

        $userFound = false;

        // Try email first if it looks like an email
        if (filter_var($identifier, FILTER_VALIDATE_EMAIL)) {
            $this->user->email = $identifier;
            if ($this->user->emailExists()) {
                $userFound = true;
            }
        }

        // If not found by email or identifier wasn't email, try phone
        if (!$userFound) {
            $this->user->phone = $identifier;
            if ($this->user->phoneExists()) {
                $userFound = true;
            }
        }

        if ($userFound) {
            if (password_verify($password, $this->user->password)) {
                // Generate Simple Token (id:random_hex)
                $token = base64_encode($this->user->id . ":" . bin2hex(random_bytes(8)));

                // Construct profile photo URL
                $profilePhotoUrl = null;
                if (!empty($this->user->profile_photo)) {
                    $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http";
                    $host = $_SERVER['HTTP_HOST'];
                    $profilePhotoUrl = "$protocol://$host/" . $this->user->profile_photo;
                }

                // Return token
                Response::success("Login successful.", [
                    "token" => $token,
                    "user_id" => (int) $this->user->id,
                    "name" => $this->user->name,
                    "role" => $this->user->role,
                    "profile_photo_url" => $profilePhotoUrl
                ]);
            } else {
                Response::error("Palavra-passe inválida.", 401);
            }
        } else {
            Response::error("Utilizador não encontrado.", 404);
        }
    }
}
?>