<?php
declare(strict_types=1);

namespace App\Controllers;

use App\Core\Controller;
use App\Core\Database;
use App\Core\Session;
use App\Core\Auth;
use App\Models\Usuario;

final class AuthController extends Controller
{
    public function login(): void
    {
        if (Auth::check()) {
            $this->redirect('');
        }

        $error = Session::get('login_error');
        Session::forget('login_error');

        $this->view('auth/login', [
            'title' => 'Iniciar sesión | ' . APP_NAME,
            'error' => $error,
        ], false);
    }

    public function authenticate(): void
    {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            $this->redirect('login');
        }

        $usuario = trim((string)($_POST['usuario'] ?? ''));
        $clave = (string)($_POST['clave'] ?? '');

        if ($usuario === '' || $clave === '') {
            Session::set(
                'login_error',
                'Ingresa tu usuario y contraseña.'
            );

            $this->redirect('login');
        }

        try {
            $model = new Usuario(Database::getConnection());

            // Mantener la autenticación actual y cargar los roles del usuario.
            $user = $model->authenticateBasic($usuario, $clave);

            if ($user) {
                $user['roles'] = $model->getRoles((int)$user['id_usuario']);
            }

        } catch (\Throwable $e) {
            error_log(
                '[SIGDA] Error de autenticación: ' .
                $e->getMessage()
            );

            Session::set(
                'login_error',
                'No se pudo conectar con el sistema.'
            );

            $this->redirect('login');
        }

        if (!$user) {
            Session::set(
                'login_error',
                'Usuario o contraseña incorrectos.'
            );

            $this->redirect('login');
        }

        // La autorización actual de Auth.php trabaja con roles.
        $user['permissions'] = [];

        // Esta versión de Auth.php recibe el usuario completo.
        Auth::login($user);

        // Solo los repartidores pasan por el detector de dispositivo.
        // En PC/laptop regresan al acceso que ya tenían: /repartidores.
        if (Auth::hasRole('Repartidor')) {
            $this->redirect('repartidoracceso');
        }

        $this->redirect('');
    }

    public function logout(): void
    {
        Auth::logout();
        $this->redirect('login');
    }
}
