<?php
require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../config/security.php';

// MODO DESARROLLO: Activo si estamos en localhost
define('DEV_MODE', ($_SERVER['HTTP_HOST'] === 'localhost' || $_SERVER['SERVER_ADDR'] === '127.0.0.1'));

if (DEV_MODE) {
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Expires: Wed, 11 Jan 1984 05:00:00 GMT");
}

function asset_url($path) {
    $version = DEV_MODE ? time() : '1.0.0';
    return site_url($path) . '?v=' . $version;
}

function site_url($path = '') {
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
    $host = $_SERVER['HTTP_HOST'] ?? 'localhost';
    
    // Detectar la carpeta raíz del proyecto (Bichotta.cl)
    $script = $_SERVER['SCRIPT_NAME']; 
    $base = str_replace('\\', '/', dirname($script));
    
    // Si estamos en una subcarpeta (admin o api), subimos un nivel para encontrar la raíz
    if (basename($base) === 'admin' || basename($base) === 'api') {
        $base = dirname($base);
    }
    
    $base = rtrim(str_replace('\\', '/', $base), '/');
    return $protocol . '://' . $host . $base . '/' . ltrim($path, '/');
}

/**
 * Rastrear visitante para analíticas tipo Shopify.
 */
function track_visitor($product_id = null) {
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
    
    $db = db();
    $session_id = session_id();
    $user_id = $_SESSION['customer_id'] ?? null;
    $ip = $_SERVER['REMOTE_ADDR'] ?? '';
    $ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
    $url = $_SERVER['REQUEST_URI'];
    $referrer = $_SERVER['HTTP_REFERER'] ?? '';

    // Detección básica de dispositivo
    $device = 'Escritorio';
    if (preg_match('/(tablet|ipad|playbook)|(android(?!.*(mobi|opera mini)))/i', strtolower($ua))) {
        $device = 'Tablet';
    } elseif (preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i', strtolower($ua))) {
        $device = 'Móvil';
    }

    try {
        $stmt = $db->prepare("INSERT INTO visitor_sessions (session_id, user_id, ip, user_agent, page_url, referrer, device, created_at, last_activity) 
                             VALUES (:sid, :uid, :ip, :ua, :url, :ref, :dev, NOW(), NOW())
                             ON DUPLICATE KEY UPDATE last_activity = NOW(), user_id = VALUES(user_id), page_url = VALUES(page_url)");
        $stmt->execute([
            'sid' => $session_id,
            'uid' => $user_id,
            'ip' => $ip,
            'ua' => $ua,
            'url' => $url,
            'ref' => $referrer,
            'dev' => $device
        ]);
    } catch (Exception $e) {}
}

/**
 * Registra una visita (Compatibilidad anterior)
 */
function track_page_view($product_id = null) {
    if (function_exists('track_visitor')) {
        track_visitor($product_id);
    }
}

/**
 * Control de Acceso por Roles (RBAC)
 */
/**
 * Devuelve el stock de un pedido al inventario original (Caso: Cancelación)
 */
function return_order_stock($order_id) {
    $db = db();
    
    // Verificar si ya fue devuelto para no duplicar
    $stmtCheck = $db->prepare("SELECT stock_returned FROM orders WHERE id = ?");
    $stmtCheck->execute([$order_id]);
    if ($stmtCheck->fetchColumn()) return false;

    // Obtener items del pedido
    $stmtItems = $db->prepare("SELECT product_id, quantity FROM order_items WHERE order_id = ?");
    $stmtItems->execute([$order_id]);
    $items = $stmtItems->fetchAll();

    foreach ($items as $item) {
        // Devolver a tabla products
        $db->prepare("UPDATE products SET stock = stock + ? WHERE id = ?")->execute([$item['quantity'], $item['product_id']]);
        
        // Devolver a variaciones si existen (Simplificado: intentamos buscar la talla si estuviera guardada en order_items)
        // Por ahora aseguramos al menos el stock general de producto.
    }

    // Marcar como devuelto
    $db->prepare("UPDATE orders SET stock_returned = 1 WHERE id = ?")->execute([$order_id]);
    return true;
}

/**
 * Registra un hito en la línea de tiempo del pedido
 */
function add_order_history($order_id, $status, $comment = '') {
    $db = db();
    $stmt = $db->prepare("INSERT INTO order_status_history (order_id, status, comment) VALUES (?, ?, ?)");
    $stmt->execute([$order_id, $status, $comment]);
}

/**
 * Envía correos automatizados por cambio de estatus de orden
 */
function send_order_status_email($order_id, $status) {
    $db = db();
    $stmt = $db->prepare("SELECT * FROM orders WHERE id = ?");
    $stmt->execute([$order_id]);
    $order = $stmt->fetch();
    
    if (!$order) return false;

    $customer_name = format_text_elegant($order['customer_name']);
    $order_number = $order['order_number'];
    $to = $order['email'];

    $subjects = [
        'Pendiente' => "Hemos recibido tu pedido #$order_number - BICHOTTA",
        'Confirmado' => "¡Pago Confirmado! Estamos listos para preparar tu envío - Pedido #$order_number",
        'Procesando' => "Tu pedido #$order_number está en proceso de validación",
        'En Embalaje' => "Estamos preparando tu paquete con empaque discreto - Pedido #$order_number",
        'En Camino' => "¡Tu pedido #$order_number va en camino! 🚚",
        'Entregado' => "¡Pedido #$order_number entregado! Esperamos que lo disfrutes ✨",
        'Cancelado' => "Actualización importante sobre tu pedido #$order_number"
    ];

    $messages = [
        'Pendiente' => 'Gracias por elegirnos. Tu pedido ha sido registrado y está a la espera de confirmación de pago.',
        'Confirmado' => '¡Excelente! Hemos confirmado tu pago. Tu pedido ha pasado a la fase de preparación.',
        'Procesando' => 'Estamos validando los detalles de tu compra para asegurar que todo esté perfecto.',
        'En Embalaje' => '¡Manos a la obra! Tu pedido está siendo preparado con todo el cuidado y bajo nuestro estándar de empaque 100% discreto.',
        'En Camino' => '¡Buenas noticias! Tu paquete ya fue entregado al transportista. Prepárate para recibirlo muy pronto.',
        'Entregado' => 'El sistema indica que ya recibiste tu compra. ¡Gracias por ser parte de la comunidad Bichotta!',
        'Cancelado' => 'Lamentamos informarte que tu pedido ha sido cancelado. El stock ha sido liberado nuevamente.'
    ];

    $subject = $subjects[$status] ?? "Actualización de tu pedido #$order_number";
    $status_msg = $messages[$status] ?? "Tu pedido ha cambiado a estado: $status";

    // Template HTML Premium
    $html = "
    <div style='font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; background: #fff; border: 1px solid #eee; border-radius: 20px; overflow: hidden; box-shadow: 0 10px 20px rgba(0,0,0,0.05);'>
        <div style='background: #000; padding: 40px; text-align: center;'>
            <h1 style='color: #F3E5AB; margin: 0; letter-spacing: 8px; font-size: 28px; font-weight: 900;'>BICHOTTA</h1>
            <p style='color: #fff; opacity: 0.7; margin-top: 10px; font-size: 12px; letter-spacing: 2px;'>BOUTIQUE FEMENINA PREMIUM</p>
        </div>
        <div style='padding: 45px; color: #111; line-height: 1.8;'>
            <h2 style='font-size: 22px; margin-bottom: 20px;'>Hola, $customer_name ✨</h2>
            <p style='font-size: 16px; color: #444;'>$status_msg</p>
            
            <div style='background: #FDFBFA; border: 1.5px solid #EEE; padding: 25px; border-radius: 15px; margin: 30px 0; border-left: 5px solid #D81B60;'>
                <p style='margin: 0 0 10px 0;'><strong>📦 Número de Pedido:</strong> #$order_number</p>
                <p style='margin: 0 0 10px 0;'><strong>📍 Estado Actual:</strong> <span style='color: #D81B60; font-weight: 800; text-transform: uppercase;'>$status</span></p>
                <p style='margin: 0;'><strong>💰 Total:</strong> " . format_price($order['total']) . "</p>
            </div>

            <div style='text-align: center; margin-top: 40px;'>
                <a href='" . site_url("mi-pedido.php?id=" . $order['order_number']) . "' style='background: #000; color: #fff; text-decoration: none; padding: 18px 35px; border-radius: 12px; font-weight: 900; font-size: 14px; letter-spacing: 1px; display: inline-block;'>SEGUIR MI PEDIDO</a>
            </div>
            
            <p style='font-size: 13px; color: #999; margin-top: 40px; text-align: center;'>Si tienes alguna duda, escríbenos a nuestro WhatsApp de soporte.</p>
        </div>
        <div style='background: #F9F9F9; padding: 30px; text-align: center; border-top: 1px solid #EEE;'>
            <p style='font-size: 11px; color: #BBB; margin: 0;'>BICHOTTA CL - Todos los derechos reservados.<br>Privacidad y Discreción Garantizada.</p>
        </div>
    </div>";

    // Registrar en Logs y Base de Datos
    $log_status = 'sent';
    $error_msg = '';
    
    if (!DEV_MODE) {
        $headers = "MIME-Version: 1.0" . "\r\n";
        $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
        $headers .= "From: BICHOTTA Boutique <" . get_setting('store_email', 'ventas@bichotta.cl') . ">" . "\r\n";
        if (!@mail($to, $subject, $html, $headers)) {
            $log_status = 'failed';
            $error_msg = 'PHP mail() function failed';
        }
    }

    $stmtLog = $db->prepare("INSERT INTO email_logs (order_id, recipient, subject, status, error_message) VALUES (?, ?, ?, ?, ?)");
    $stmtLog->execute([$order_id, $to, $subject, $log_status, $error_msg]);

    return ($log_status === 'sent');
}

function has_permission($role_required) {
    $current_role = $_SESSION['admin_role'] ?? 'admin'; // Default fallback
    
    $hierarchy = [
        'SUPER_ADMIN' => 100,
        'ADMIN'       => 80,
        'VENDEDOR'    => 50,
        'MARKETING'   => 50,
        'SOPORTE'     => 30
    ];

    $user_level = $hierarchy[strtoupper($current_role)] ?? 0;
    $req_level = $hierarchy[strtoupper($role_required)] ?? 0;

    return ($user_level >= $req_level);
}

function require_permission($role) {
    if (!has_permission($role)) {
        header('Location: index.php?error=no_permission');
        exit;
    }
}

function slugify($text) {
    $text = preg_replace('~[^\pL\d]+~u', '-', $text);
    $text = iconv('UTF-8', 'ASCII//TRANSLIT', $text);
    $text = preg_replace('~[^-\w]+~', '', $text);
    $text = trim($text, '-');
    $text = preg_replace('~-+~', '-', $text);
    $text = strtolower($text);
    return $text;
}

function limit_text($text, $limit = 160) {
    if (strlen($text) <= $limit) return $text;
    return substr($text, 0, $limit - 3) . '...';
}

function get_categories() {
    $sql = 'SELECT * FROM categories WHERE status = 1 ORDER BY name ASC';
    return db()->query($sql)->fetchAll();
}

function get_setting($key, $default = '') {
    $stmt = db()->prepare('SELECT value FROM settings WHERE `key` = :key LIMIT 1');
    $stmt->execute(['key' => $key]);
    $result = $stmt->fetchColumn();
    return $result !== false ? $result : $default;
}

function get_product_by_slug($slug) {
    $stmt = db()->prepare('SELECT p.*, c.name AS category_name FROM products p LEFT JOIN categories c ON p.category_id = c.id WHERE p.slug = :slug AND p.status = 1 LIMIT 1');
    $stmt->execute(['slug' => $slug]);
    return $stmt->fetch();
}

function get_product_images($productId) {
    $stmt = db()->prepare('SELECT image FROM product_images WHERE product_id = :product_id ORDER BY id ASC');
    $stmt->execute(['product_id' => $productId]);
    return $stmt->fetchAll(PDO::FETCH_COLUMN);
}

/**
 * Formato de precio chileno (ej: $21.000)
 */
function format_price($amount) {
    return '$' . number_format((float)$amount, 0, ',', '.');
}

/**
 * Convierte texto a formato elegante (Primera letra mayúscula, resto minúscula)
 * Evita el efecto de "GRITAR" en los nombres de productos.
 */
function format_text_elegant($text) {
    return mb_convert_case(mb_strtolower(trim($text)), MB_CASE_TITLE, "UTF-8");
}

function clean_input($value) {
    if (is_array($value)) return array_map('clean_input', $value);
    return trim($value);
}

function admin_header($title = 'Panel Bichotta') {
    $title = $title; // Compatibility
    include __DIR__ . '/admin-header.php';
}

function admin_footer() {
    include __DIR__ . '/admin-footer.php';
}
