<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

require_once __DIR__ . '/../../config.php';

$body     = json_decode(file_get_contents('php://input'), true);
$usuario  = trim(isset($body['usuario'])  ? $body['usuario']  : '');
$password = trim(isset($body['password']) ? $body['password'] : '');
$dbRemote = !empty($body['db_remote']) ? 1 : 0;

if (empty($usuario) || empty($password)) {
    http_response_code(400);
    echo json_encode(array('success' => false, 'message' => 'Usuario y contraseña requeridos'));
    exit;
}

// Autenticar siempre contra la BD LOCAL
$dbLocal = getDB(false);

$stmt = $dbLocal->prepare(
    "SELECT idusuarios_sist, nombre_usr, rango_idrango
     FROM usuarios_sist
     WHERE nombre_usr = ? AND passwd = MD5(?)
     LIMIT 1"
);
$stmt->execute(array($usuario, $password));
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$user) {
    http_response_code(401);
    echo json_encode(array('success' => false, 'message' => 'Usuario o contraseña incorrectos'));
    exit;
}

// Generar token
$token  = bin2hex(openssl_random_pseudo_bytes(32));
$expira = date('Y-m-d H:i:s', strtotime('+8 hours'));

// Crear tabla si no existe (en BD local)
$dbLocal->exec(
    "CREATE TABLE IF NOT EXISTS admin_sessions (
        id INT AUTO_INCREMENT PRIMARY KEY,
        idusuarios_sist INT NOT NULL,
        token VARCHAR(64) NOT NULL,
        expira DATETIME NOT NULL,
        db_remote TINYINT(1) NOT NULL DEFAULT 0,
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        UNIQUE KEY uq_token (token),
        INDEX idx_usuario (idusuarios_sist)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8"
);
try { $dbLocal->exec("ALTER TABLE admin_sessions ADD COLUMN db_remote TINYINT(1) NOT NULL DEFAULT 0"); } catch (Exception $e) {}

// Guardar sesión en BD LOCAL
$dbLocal->prepare("DELETE FROM admin_sessions WHERE idusuarios_sist = ?")->execute(array($user['idusuarios_sist']));
$dbLocal->prepare("INSERT INTO admin_sessions (idusuarios_sist, token, expira, db_remote) VALUES (?, ?, ?, ?)")
        ->execute(array($user['idusuarios_sist'], $token, $expira, $dbRemote));

// Si es remota, también guardar el token en la BD REMOTA
// (para que los endpoints que consulten admin_sessions en remota también lo encuentren)
if ($dbRemote) {
    try {
        $dbRem = getDB(true);
        $dbRem->exec(
            "CREATE TABLE IF NOT EXISTS admin_sessions (
                id INT AUTO_INCREMENT PRIMARY KEY,
                idusuarios_sist INT NOT NULL,
                token VARCHAR(64) NOT NULL,
                expira DATETIME NOT NULL,
                db_remote TINYINT(1) NOT NULL DEFAULT 0,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
                UNIQUE KEY uq_token (token),
                INDEX idx_usuario (idusuarios_sist)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8"
        );
        try { $dbRem->exec("ALTER TABLE admin_sessions ADD COLUMN db_remote TINYINT(1) NOT NULL DEFAULT 0"); } catch (Exception $e) {}
        $dbRem->prepare("DELETE FROM admin_sessions WHERE idusuarios_sist = ?")->execute(array($user['idusuarios_sist']));
        $dbRem->prepare("INSERT INTO admin_sessions (idusuarios_sist, token, expira, db_remote) VALUES (?, ?, ?, ?)")
              ->execute(array($user['idusuarios_sist'], $token, $expira, $dbRemote));
    } catch (Exception $e) {
        // Si falla la BD remota, continuar con la local
    }
}

echo json_encode(array(
    'success' => true,
    'data'    => array(
        'token'     => $token,
        'usuario'   => $user['nombre_usr'],
        'rango'     => $user['rango_idrango'],
        'expira'    => $expira,
        'db_remote' => (bool)$dbRemote,
    )
));
