<?php
/**
 * config.php — bootstrap de kamiquery.
 *
 * Único lugar donde arranca todo: constantes, errores, $_config, includes,
 * autoload, i18n y autenticación. index.php solo hace include_once de este archivo.
 *
 * Para saltar la auth (páginas públicas: login/logout) define NO_LOGIN antes de
 * incluir este archivo.
 */

// 1) Marca el acceso por el flujo legítimo.
define('IN_APP', true);

// 2) Errores + anti-caché.
ini_set('display_errors', '0');           // en producción: fatal = página en blanco; ver error_log
ini_set('log_errors', '1');
error_reporting(E_ALL);
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');

// 3) Configuración global de la app.
$_config = array(
    'name'           => 'kamiquery',
    'url'            => 'https://kamiquery.com',
    'secret'         => 'ffd3c68de7f643d39ef087706d07f120d5e09b37abd3420eccc865daa58dc7700b8d754506eadb85c936fe3660168967',
    'default_locale' => 'es',
    'locales'        => array('es', 'en'),

    // URL base de la gateway (KamiCode / Cline → compatible OpenAI).
    'gateway_url'    => 'https://ia.kamiquery.com/v1',

    // Proveedor LLM upstream (la API key vive SOLO aquí, en el servidor).
    'llm' => array(
        'provider' => 'stub',            // 'stub' | 'claude' | 'gemini' | ...
        'api_key'  => '',                // TODO: poner la key del proveedor real
        'model'    => 'kamiquery-default',
    ),
);

// 4) Includes de infraestructura.
include_once __DIR__ . '/inc/db.php';
include_once __DIR__ . '/inc/vars.php';

// 5) Autoloader de class/ (solo dentro de class/, sin fallback).
spl_autoload_register(function ($cls) {
    if (!preg_match('/^[A-Za-z0-9_]+$/', $cls)) return;
    $f = __DIR__ . '/class/' . strtolower($cls) . '.php';
    if (is_file($f)) include_once $f;
});

// 6) Instancias base.
$app     = new App($mysqli, $_config);
$headers = new Headers();

// 7) Autenticación: carga $_user a partir de la cookie de sesión.
//    Rutas públicas (login/register/logout) no exigen sesión.
$auth       = new Auth($mysqli, $_config);
$_user      = $auth->resolve();   // null si no hay sesión válida
$_is_public = in_array($_module, array('login', 'register', 'logout', 'oauth', 'api', 'download'), true);

if (!$_is_public && $_user === null) {
    App::redirect('/login/');
}

// 8) Cambio de idioma explícito (?lang=xx): fija la cookie y persiste en el usuario.
if (isset($_GET['lang']) && in_array($_GET['lang'], $_config['locales'], true)) {
    $lang = $_GET['lang'];
    setcookie('lang', $lang, array('expires' => time() + 365 * 86400, 'path' => '/', 'samesite' => 'Lax'));
    $_COOKIE['lang'] = $lang;
    if ($_user) {
        $st = $mysqli->prepare('UPDATE users SET locale = ? WHERE id_user = ?');
        $st->bind_param('si', $lang, $_user['id_user']);
        $st->execute();
        $st->close();
    }
}

// 9) i18n: resuelve el idioma activo y carga lang/{locale}.php.
//    Prioridad: cookie lang -> users.locale -> Accept-Language -> default.
$app->loadLocale($_user);
