<?php
// includes/auth.php

class Auth {
    private $db;
    private $sessionName = 'admin_id';
    private $sessionToken = 'admin_token';
    
    public function __construct() {
        global $db;
        $this->db = $db;
        
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }
    }
    
    /**
     * Verifica se o usuário está autenticado e redireciona se não estiver
     */
    public function requireAuth() {
        if (!$this->isLoggedIn()) {
            setAlert("Por favor, faça login para continuar.", ALERT_WARNING);
            redirect('login.php');
            exit;
        }
        
        try {
            $this->db->query("SELECT id, token_expiry FROM admins 
                             WHERE id = :id AND token = :token");
            
            $this->db->bind(':id', $_SESSION[$this->sessionName]);
            $this->db->bind(':token', $_SESSION[$this->sessionToken]);
            
            $admin = $this->db->single();
            
            if (!$admin || strtotime($admin['token_expiry']) < time()) {
                $this->logout();
                setAlert("Sua sessão expirou. Por favor, faça login novamente.", ALERT_WARNING);
                redirect('login.php');
                exit;
            }
            
            return true;
            
        } catch (Exception $e) {
            $this->logout();
            setAlert("Erro na verificação. Por favor, faça login novamente.", ALERT_ERROR);
            redirect('login.php');
            exit;
        }
    }
    
    public function login($email, $password) {
        try {
            // 1. Busca o usuário
            $this->db->query("SELECT * FROM admins WHERE email = :email");
            $this->db->bind(':email', $email);
            $admin = $this->db->single();
            
            if (!$admin) {
                throw new Exception("E-mail ou senha incorretos.");
            }
            
            // 2. Verifica a senha
            if (!password_verify($password, $admin['password'])) {
                throw new Exception("E-mail ou senha incorretos.");
            }
            
            // 3. Gera novo token
            $token = bin2hex(random_bytes(32));
            $expiry = date('Y-m-d H:i:s', strtotime('+2 hours'));
            
            // 4. Atualiza token no banco
            $this->db->query("UPDATE admins SET 
                             token = :token,
                             token_expiry = :expiry,
                             last_login = NOW(),
                             last_ip = :ip
                             WHERE id = :id");
            
            $this->db->bind(':token', $token);
            $this->db->bind(':expiry', $expiry);
            $this->db->bind(':ip', $_SERVER['REMOTE_ADDR']);
            $this->db->bind(':id', $admin['id']);
            
            if (!$this->db->execute()) {
                throw new Exception("Erro ao fazer login.");
            }
            
            // 5. Define sessão
            $_SESSION[$this->sessionName] = $admin['id'];
            $_SESSION[$this->sessionToken] = $token;
            $_SESSION['admin_name'] = $admin['username'];
            $_SESSION['admin_email'] = $admin['email'];
            $_SESSION['admin_role'] = $admin['role'];
            
            return true;
            
        } catch (Exception $e) {
            throw $e;
        }
    }
    
    public function isLoggedIn() {
        if (!isset($_SESSION[$this->sessionName]) || !isset($_SESSION[$this->sessionToken])) {
            return false;
        }
        
        try {
            $this->db->query("SELECT id FROM admins 
                             WHERE id = :id 
                             AND token = :token 
                             AND token_expiry > NOW()");
            
            $this->db->bind(':id', $_SESSION[$this->sessionName]);
            $this->db->bind(':token', $_SESSION[$this->sessionToken]);
            
            return (bool)$this->db->single();
            
        } catch (Exception $e) {
            logError("Erro na verificação de login: " . $e->getMessage());
            return false;
        }
    }
    
    public function logout() {
        try {
            if (isset($_SESSION[$this->sessionName])) {
                $this->db->query("UPDATE admins SET 
                                 token = NULL,
                                 token_expiry = NULL 
                                 WHERE id = :id");
                $this->db->bind(':id', $_SESSION[$this->sessionName]);
                $this->db->execute();
            }
            
            session_unset();
            session_destroy();
            
            return true;
        } catch (Exception $e) {
            logError("Erro no logout: " . $e->getMessage());
            return false;
        }
    }
}

// Instancia a classe de autenticação
$auth = new Auth();