<?php
/**
 * TechShop Perú - Configuración Principal
 * 
 * Define constantes globales, rutas y configuración del sistema.
 * 
 * @package TechShop Perú
 * @version 1.0
 */

// Prevenir acceso directo
if (!defined('SECURE_ACCESS')) {
    define('SECURE_ACCESS', true);
}

// ============================================
// CONFIGURACIÓN DE BASE DE DATOS
// ============================================
// Prioridad de configuración (de mayor a menor):
//   1. Variables de entorno reales (cPanel, Docker, etc.)
//   2. Archivo .env en la raíz del proyecto (opcional)
//   3. Valores por defecto según el entorno detectado:
//      - Local (localhost/127.0.0.1, ej. XAMPP): root / techshop_peru
//      - Producción (cPanel): usuario seguro, NUNCA root

// Cargar .env si existe, guardando los valores en un array local.
// NO se usa putenv(): muchos hostings cPanel lo tienen en disable_functions
// (en PHP 8 llamarlo provocaría un error fatal en cada página).
// Las variables de entorno reales siempre tienen prioridad sobre el .env.
$envFilePath = realpath(__DIR__ . '/../.env');
$envFileValues = [];
if ($envFilePath !== false && is_readable($envFilePath)) {
    foreach (file($envFilePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $envLine) {
        $envLine = trim($envLine);
        if ($envLine === '' || strpos($envLine, '#') === 0 || strpos($envLine, '=') === false) {
            continue;
        }
        [$envKey, $envValue] = explode('=', $envLine, 2);
        $envKey = trim($envKey);
        if ($envKey !== '') {
            $envFileValues[$envKey] = trim($envValue);
        }
    }
}

// Lee una variable: primero del entorno real, luego del archivo .env.
$getCfg = static function (string $key) use (&$envFileValues): ?string {
    $realValue = getenv($key);
    if ($realValue !== false && $realValue !== '') {
        return $realValue;
    }
    return $envFileValues[$key] ?? null;
};

$envDbHost = $getCfg('DB_HOST') ?: $getCfg('MYSQL_HOST') ?: $getCfg('DB_HOSTNAME');
$envDbName = $getCfg('DB_NAME') ?: $getCfg('MYSQL_DATABASE') ?: $getCfg('DB_DATABASE');
$envDbUser = $getCfg('DB_USER') ?: $getCfg('MYSQL_USER') ?: $getCfg('DB_USERNAME');
$envDbPass = $getCfg('DB_PASS') ?: $getCfg('MYSQL_PASSWORD') ?: $getCfg('DB_PASSWORD');

// Detección de entorno local (XAMPP/WAMP/MAMP).
// Se usa SERVER_ADDR (la fija el servidor, el cliente no puede forjarla)
// y NO solo HTTP_HOST, que sí es controlable por el cliente y podría
// provocar un fallback a 'root' en producción. Además, si APP_ENV indica
// producción, nunca se aplica el fallback local (importante en VPS con
// nginx + PHP-FPM, donde SERVER_ADDR suele ser 127.0.0.1).
$envAppMode = strtolower((string) ($getCfg('APP_ENV') ?: $getCfg('ENVIRONMENT') ?: ''));
$isProduction = in_array($envAppMode, ['production', 'prod', 'live'], true);

$detectHost = strtolower((string) ($_SERVER['HTTP_HOST'] ?? ''));
if (strpos($detectHost, ':') !== false) {
    $detectHost = (string) parse_url('http://' . $detectHost, PHP_URL_HOST);
}
$serverAddr = strtolower((string) ($_SERVER['SERVER_ADDR'] ?? ''));
$isLocalHost = !$isProduction && (
    in_array($serverAddr, ['127.0.0.1', '::1'], true)
    // En CLI/tests SERVER_ADDR no existe: se acepta localhost solo en ese caso.
    || ($serverAddr === '' && in_array($detectHost, ['localhost', '127.0.0.1', '[::1]', '::1'], true))
);

// Fallback seguro para cPanel/hosting compartido.
// Si el hosting no define variables de entorno, se deberá configurar manualmente.
// Se evita usar 'root' como valor por defecto para no comprometer la instalación.
define('DB_HOST', $envDbHost ?: 'localhost');
define('DB_NAME', $envDbName ?: ($isLocalHost ? 'techshop_peru' : 'techstore_db'));
define('DB_USER', $envDbUser ?: ($isLocalHost ? 'root' : 'techstore_user'));
define('DB_PASS', $envDbPass ?: '');
define('DB_CHARSET', 'utf8mb4');

// Protección: nunca conectarse como 'root' fuera del entorno local (XAMPP).
// En cPanel/hosting los usuarios de BD llevan el prefijo de la cuenta
// (ej. usuario_techstore_user) y 'root' no existe → Access denied.
// Esta es la causa #1 del error "Access denied for user 'root'@'localhost'"
// en despliegues: se sube el .env local sin editar. Se omite en CLI (tests),
// donde SERVER_ADDR no existe.
if ($serverAddr !== '' && !$isLocalHost && strtolower(DB_USER) === 'root') {
    error_log('TechShop: DB_USER=root detectado en entorno no local. Revisa el archivo .env (DB_USER/DB_PASS).');
    die(
        'Error de configuración: DB_USER=root solo es válido en el entorno local (XAMPP). ' .
        'En cPanel crea un usuario de base de datos en "MySQL® Databases", asígnalo con TODOS los ' .
        'privilegios y usa sus credenciales en el archivo .env del servidor.'
    );
}

// ============================================
// FINANCIAMIENTO
// ============================================
// Número de cuotas sin intereses promocionadas (se muestra en el detalle
// de producto junto al precio). Editable por el administrador.
define('CUOTAS_SIN_INTERES', 12);

// ============================================
// RUTAS DEL SISTEMA
// ============================================
function detect_request_scheme(): string
{
    if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') {
        return 'https';
    }

    if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https') {
        return 'https';
    }

    if (!empty($_SERVER['REQUEST_SCHEME']) && strtolower($_SERVER['REQUEST_SCHEME']) === 'https') {
        return 'https';
    }

    return ((int) ($_SERVER['SERVER_PORT'] ?? 80)) === 443 ? 'https' : 'http';
}

function detect_base_path(): string
{
    // 1) Comparación con DOCUMENT_ROOT (fiable en Apache/Nginx/servidor embebido).
    //    No se usa SCRIPT_NAME como fuente primaria: las páginas viven en
    //    subcarpetas (pages/, api/, admin/) y su directorio NO es la ruta base
    //    de la aplicación (generaba rutas duplicadas tipo /pages/pages/...).
    $docRoot = str_replace('\\', '/', realpath($_SERVER['DOCUMENT_ROOT'] ?? '') ?: '');
    $projectRoot = str_replace('\\', '/', realpath(__DIR__ . '/../') ?: '');

    // Límite de directorio: evita que /var/www2 matchee con DOCUMENT_ROOT=/var/www.
    if ($docRoot !== '' && $projectRoot !== '' && ($projectRoot === $docRoot || strpos($projectRoot, $docRoot . '/') === 0)) {
        return '/' . trim(substr($projectRoot, strlen($docRoot)), '/');
    }

    // 2) Fallback solo para entornos sin DOCUMENT_ROOT (p. ej. CLI/tests).
    $scriptName = $_SERVER['SCRIPT_NAME'] ?? $_SERVER['PHP_SELF'] ?? '';
    if ($docRoot === '' && $scriptName !== '') {
        $path = dirname($scriptName);
        if ($path !== '.' && $path !== '/') {
            return '/' . trim($path, '/');
        }
    }

    return '';
}

$scheme = detect_request_scheme();
$host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? 'localhost';
$basePath = detect_base_path();

define('ROOT_PATH', realpath(__DIR__ . '/../') . DIRECTORY_SEPARATOR);
define('BASE_URL', $scheme . '://' . $host . ($basePath !== '' ? $basePath : ''));
define('INCLUDES_PATH', ROOT_PATH . 'includes' . DIRECTORY_SEPARATOR);
define('UPLOADS_PATH', ROOT_PATH . 'uploads' . DIRECTORY_SEPARATOR);
define('ASSETS_URL', BASE_URL . '/assets');
define('UPLOADS_URL', BASE_URL . '/uploads');

// ============================================
// CONFIGURACIÓN DE LA TIENDA
// ============================================
// CONFIGURACIÓN DE LA TIENDA (Cargada desde DB)
// ============================================
// Los valores de la tienda como TIENDA_NOMBRE, TIENDA_EMAIL, etc.
// ahora se cargan dinámicamente desde la tabla `configuraciones`
// a través de functions.php -> init_db_config()


// ============================================
// CONFIGURACIÓN DE SESIÓN
// ============================================
ini_set('session.cookie_httponly', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_samesite', 'Lax');
if ($scheme === 'https') {
    ini_set('session.cookie_secure', 1);
}

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// Generar ID de sesión para carrito de invitados
if (!isset($_SESSION['carrito_sesion_id'])) {
    $_SESSION['carrito_sesion_id'] = bin2hex(random_bytes(32));
}

// ============================================
// ZONA HORARIA
// ============================================
date_default_timezone_set('America/Lima');

// ============================================
// MODO DEBUG (cambiar a false en producción)
// ============================================
$envAppMode = getenv('APP_ENV') ?: getenv('ENVIRONMENT');
$debugMode = !in_array(strtolower((string) ($envAppMode ?: 'development')), ['production', 'prod', 'live'], true);
define('DEBUG_MODE', $debugMode);

if (DEBUG_MODE) {
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
} else {
    error_reporting(0);
    ini_set('display_errors', 0);
}

// Crear carpetas de subida necesarias si no existen.
$requiredDirectories = [
    UPLOADS_PATH,
    UPLOADS_PATH . 'banners' . DIRECTORY_SEPARATOR,
    UPLOADS_PATH . 'products' . DIRECTORY_SEPARATOR,
    UPLOADS_PATH . 'vouchers' . DIRECTORY_SEPARATOR,
    UPLOADS_PATH . 'reviews' . DIRECTORY_SEPARATOR,
    ROOT_PATH . 'assets' . DIRECTORY_SEPARATOR . 'img' . DIRECTORY_SEPARATOR . 'productos' . DIRECTORY_SEPARATOR,
];

foreach ($requiredDirectories as $directory) {
    if (!is_dir($directory) && !@mkdir($directory, 0755, true) && !is_dir($directory)) {
        error_log('No se pudo crear la carpeta de almacenamiento: ' . $directory);
    }
}
