<?php

namespace App\Controllers;

use App\Models\UserModel;
use CodeIgniter\HTTP\Response;
use CodeIgniter\API\ResponseTrait;

$allowedOrigins = [
    // 'https://catchef.bravecatstudios.com',  // Producción
    'http://localhost:4200', // Desarrollo en local
    'http://localhost:8080', // Desarrollo en local con MAC
];

if (isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], $allowedOrigins)) {
    header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
}

header('Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
header('Access-Control-Allow-Credentials: true');

class AuthController extends BaseController
{
    use ResponseTrait;

    public function options()
    {
        return $this->response
            ->setStatusCode(200)
            ->setHeader('Access-Control-Allow-Origin', '*')
            ->setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization')
            ->setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
            ->setHeader('Access-Control-Allow-Credentials', 'true');
    }


    public function login()
    {
        $session = session();
        $data = $this->request->getJSON();
    
        // Validar datos obligatorios
        if (!isset($data->Email) || !isset($data->Password)) {
            return $this->fail('Faltan campos obligatorios', 400);
        }
    
        $userModel = new UserModel();
        $user = $userModel->where('Email', $data->Email)->first();
    
        if (!$user) {
            return $this->fail('Usuario no encontrado', 401);
        }
    
        // **Forzar cierre de cualquier sesión previa**
        // if ($user['IsActive'] == 1) {
        //     // log_message('warning', "Usuario {$user['Username']} tenía una sesión activa. Reiniciando...");
        //     $userModel->update($user['PK_User'], ['IsActive' => 0]);
        // }
    
        // Verificar la contraseña
        if (!password_verify($data->Password, $user['Password'])) {
            return $this->fail('Credenciales inválidas', 401);
        }
    
        // Marcar usuario como logueado
        // $userModel->update($user['PK_User'], [
        //     'LastLogin' => date('Y-m-d H:i:s'),
        //     'IsActive' => 1  
        // ]);
    
        // Guardar datos en sesión
        $sessionData = [
            'PK_User' => $user['PK_User'],
            'Name' => $user['Name'],
            'Email' => $user['Email'],
            'Rol' => $user['Rol'],
            'PhotoUrl' => base_url($user['PhotoUrl']),
            //  $user['PhotoUrl'] = base_url($user['PhotoUrl']);
            // 'IsActive' => 1
        ];
        $session->set($sessionData);
    
        return $this->respond([
            'message' => 'Login exitoso',
            'PK_User' => $user['PK_User'],
            'Name' => $user['Name'],
            'Email' => $user['Email'],
            'Rol' => $user['Rol'],
            'PhotoUrl' => base_url($user['PhotoUrl']),
            // 'IsActive' => 1
        ], 200);
    }

    public function logout()
    {
        $session = session();
        $data = $this->request->getJSON();
    
        // Validar que se envió `PK_User`
        if (!isset($data->PK_User)) {
            return $this->fail('Falta el ID de usuario para cerrar sesión.', 400);
        }
    
        $PK_User = $data->PK_User;
    
        // Verificar que el usuario existe en la BD
        $userModel = new UserModel();
        $user = $userModel->find($PK_User);
    
        if (!$user) {
            return $this->fail('Usuario no encontrado', 404);
        }
    
        // log_message('info', "Logout solicitado para usuario: {$PK_User}. Estado actual: {$user['IsActive']}");
    
        // Actualizar IsActive a 0 (usuario desconectado)
        // $userModel->update($PK_User, [
        //     'LastLogout' => date('Y-m-d H:i:s'),
        //     'IsActive' => 0  
        // ]);
    
        // LOG 📌: Verificar si la BD realmente cambió
        $updatedUser = $userModel->find($PK_User);
        // log_message('info', "Usuario {$PK_User} después del logout. Estado actualizado: {$updatedUser['IsActive']}");
    
        // Destruir la sesión en el servidor
        $session->destroy();
    
        // log_message('info', "Sesión destruida para usuario: {$PK_User}");
    
        return $this->respond(['message' => 'Logout exitoso'], 200);
    }
}