<?php
header('Content-Type: application/json');
require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../includes/helpers.php';

$pdo = getConnection();

try {
    $sucursal_id = intval($_GET['sucursal_id'] ?? 0);
    $fecha_desde = $_GET['fecha_desde'] ?? date('Y-m-d');
    $fecha_hasta = $_GET['fecha_hasta'] ?? date('Y-m-d');

    $where_suc = $sucursal_id ? "AND v.sucursal_id = $sucursal_id" : '';
    $where_suc_g = $sucursal_id ? "AND g.sucursal_id = $sucursal_id" : '';

    // Ventas del período
    $st = $pdo->prepare("SELECT COUNT(*) as transacciones,
                                COALESCE(SUM(v.total),0) as total,
                                COALESCE(SUM(v.monto_efectivo),0) as efectivo,
                                COALESCE(SUM(v.monto_tarjeta),0) as tarjeta,
                                COALESCE(SUM(v.descuento),0) as descuentos
                         FROM ventas v
                         WHERE DATE(v.fecha_y_hora) BETWEEN ? AND ? $where_suc");
    $st->execute([$fecha_desde, $fecha_hasta]);
    $ventas = $st->fetch(PDO::FETCH_ASSOC);

    // Ventas por sucursal (útil cuando Todas)
    $st2 = $pdo->prepare("SELECT s.nombre, COUNT(*) as transacciones, COALESCE(SUM(v.total),0) as total
                          FROM ventas v JOIN sucursales s ON s.id=v.sucursal_id
                          WHERE DATE(v.fecha_y_hora) BETWEEN ? AND ? $where_suc
                          GROUP BY v.sucursal_id, s.nombre ORDER BY total DESC");
    $st2->execute([$fecha_desde, $fecha_hasta]);
    $por_sucursal = $st2->fetchAll(PDO::FETCH_ASSOC);

    // Utilidad estimada
    $st3 = $pdo->prepare("SELECT COALESCE(SUM(dv.precio * dv.cantidad -
                           COALESCE(pcp.costo_promedio_unidad_base * dv.cantidad * dv.factor_conversion_usado,0)),0) as utilidad
                          FROM detalle_ventas dv
                          JOIN ventas v ON v.id=dv.venta_id
                          LEFT JOIN productos_costo_promedio pcp ON pcp.producto_id=dv.producto_id
                          WHERE DATE(v.fecha_y_hora) BETWEEN ? AND ? $where_suc");
    $st3->execute([$fecha_desde, $fecha_hasta]);
    $utilidad = (float)$st3->fetchColumn();

    // Gastos variables del período (excluyendo fijos)
    $st_var = $pdo->prepare("SELECT COALESCE(SUM(g.monto),0) as total, COUNT(*) as transacciones
                             FROM gastos_operativos g
                             LEFT JOIN categorias_gastos c ON c.id = g.categoria_id
                             WHERE (c.tipo = 'variable' OR c.tipo IS NULL) 
                               AND g.fecha_gasto BETWEEN ? AND ? $where_suc_g");
    $st_var->execute([$fecha_desde, $fecha_hasta]);
    $gastos_variables = $st_var->fetch(PDO::FETCH_ASSOC);

    // Gastos fijos del período (registrados en este rango)
    $st_fix = $pdo->prepare("SELECT COALESCE(SUM(g.monto),0) as total, COUNT(*) as transacciones
                             FROM gastos_operativos g
                             JOIN categorias_gastos c ON c.id = g.categoria_id
                             WHERE c.tipo = 'fija' 
                               AND g.fecha_gasto BETWEEN ? AND ? $where_suc_g");
    $st_fix->execute([$fecha_desde, $fecha_hasta]);
    $gastos_fijos_registrados = $st_fix->fetch(PDO::FETCH_ASSOC);

    // Total gastos operativos (para mostrar en la tarjeta de gastos general)
    $gastos_op_total = (float)$gastos_variables['total'] + (float)$gastos_fijos_registrados['total'];
    $gastos_op_transacciones = (int)$gastos_variables['transacciones'] + (int)$gastos_fijos_registrados['transacciones'];

    // Gastos fijos del mes completo (para estimación de punto de equilibrio)
    $first_day_of_month = date('Y-m-01', strtotime($fecha_desde));
    $last_day_of_month = date('Y-m-t', strtotime($fecha_desde));
    
    $st_fixed_month = $pdo->prepare("SELECT COALESCE(SUM(g.monto),0)
                                     FROM gastos_operativos g
                                     JOIN categorias_gastos c ON c.id = g.categoria_id
                                     WHERE c.tipo = 'fija' 
                                       AND g.fecha_gasto BETWEEN ? AND ? $where_suc_g");
    $st_fixed_month->execute([$first_day_of_month, $last_day_of_month]);
    $registered_fixed_monthly = (float)$st_fixed_month->fetchColumn();

    // Caja chica egresos del período
    $st5 = $pdo->prepare("SELECT COALESCE(SUM(monto),0) as total FROM caja_chica_movimientos
                          WHERE tipo='egreso' AND DATE(fecha) BETWEEN ? AND ?");
    $st5->execute([$fecha_desde, $fecha_hasta]);
    $caja_chica = (float)$st5->fetchColumn();

    // Top 10 productos más vendidos
    $st6 = $pdo->prepare("SELECT p.NombreComercial as producto, p.CodigoInterno as codigo,
                                 SUM(dv.cantidad) as qty, SUM(dv.precio * dv.cantidad) as total
                          FROM detalle_ventas dv
                          JOIN ventas v ON v.id=dv.venta_id
                          JOIN productos p ON p.id=dv.producto_id
                          WHERE DATE(v.fecha_y_hora) BETWEEN ? AND ? $where_suc
                          GROUP BY dv.producto_id, p.NombreComercial, p.CodigoInterno ORDER BY qty DESC LIMIT 10");
    $st6->execute([$fecha_desde, $fecha_hasta]);
    $top_productos = $st6->fetchAll(PDO::FETCH_ASSOC);

    // Últimas ventas
    $st7 = $pdo->prepare("SELECT v.id, v.total, v.fecha_y_hora, s.nombre as sucursal, tp.nombre as tipo_pago
                          FROM ventas v
                          JOIN sucursales s ON s.id=v.sucursal_id
                          JOIN tipopago tp ON tp.id=v.id_tipopago
                          WHERE DATE(v.fecha_y_hora) BETWEEN ? AND ? $where_suc
                          ORDER BY v.fecha_y_hora DESC LIMIT 20");
    $st7->execute([$fecha_desde, $fecha_hasta]);
    $ultimas_ventas = $st7->fetchAll(PDO::FETCH_ASSOC);

    // === Meta del período (punto de equilibrio) ===
    // Config valores generales
    if ($sucursal_id > 0) {
        $cfg = $pdo->query("SELECT gastos_fijos_mensuales, dias_operativos_mes, margen_ganancia_defecto, moneda_simbolo 
                            FROM sucursal_configuracion 
                            WHERE sucursal_id = $sucursal_id")->fetch();
    } else {
        $cfg = $pdo->query("SELECT SUM(gastos_fijos_mensuales) as gastos_fijos_mensuales, 
                                   MAX(dias_operativos_mes) as dias_operativos_mes, 
                                   AVG(margen_ganancia_defecto) as margen_ganancia_defecto, 
                                   'Q' as moneda_simbolo 
                            FROM sucursal_configuracion")->fetch();
    }
    if (!$cfg) {
        $cfg = ['gastos_fijos_mensuales' => 0, 'dias_operativos_mes' => 30, 'margen_ganancia_defecto' => 30, 'moneda_simbolo' => 'Q'];
    }
    $gastos_fijos_base = (float)($cfg['gastos_fijos_mensuales'] ?? 0);
    
    // Dynamic fixed expenses: maximum of static config and actual registered fixed expenses for this month
    $gastos_fijos = max($gastos_fijos_base, $registered_fixed_monthly);
    
    $dias_op = max(1, (int)($cfg['dias_operativos_mes'] ?? 30));
    $margen_pct = (float)($cfg['margen_ganancia_defecto'] ?? 30);
    $margen_dec = $margen_pct / 100;

    // Calcular número de días del período
    $f1 = new DateTime($fecha_desde);
    $f2 = new DateTime($fecha_hasta);
    $dias_periodo = max(1, (int)$f1->diff($f2)->days + 1);

    // Gastos fijos del período (proporcional al rango de días)
    $gastos_diarios = $gastos_fijos / $dias_op;
    $gastos_fijos_periodo = $gastos_diarios * $dias_periodo;

    // Ventas del período (ya están calculadas en $ventas)
    $ventas_periodo = (float)$ventas['total'];

    // Gastos reales del período (solo variables + caja chica)
    // Excluimos los fijos registrados porque ya se estiman proporcionalmente en $gastos_fijos_periodo
    $gastos_op_periodo = (float)$gastos_variables['total'];
    $gastos_periodo = $gastos_op_periodo + $caja_chica;

    $punto_equilibrio = $margen_dec > 0 ? ($gastos_fijos_periodo / $margen_dec) : 0;
    $meta_periodo = $punto_equilibrio + ($margen_dec > 0 ? ($gastos_periodo / $margen_dec) : $gastos_periodo);
    $progreso = $meta_periodo > 0 ? min(100, round(($ventas_periodo / $meta_periodo) * 100, 1)) : 0;
    $falta = max(0, $meta_periodo - $ventas_periodo);

    json_success([
        'meta' => [
            'ventas_periodo' => $ventas_periodo,
            'gastos_periodo' => $gastos_periodo,
            'gastos_fijos_mensuales' => $gastos_fijos,
            'gastos_fijos_periodo' => round($gastos_fijos_periodo, 2),
            'dias_periodo' => $dias_periodo,
            'margen_porcentaje' => $margen_pct,
            'punto_equilibrio' => round($punto_equilibrio, 2),
            'meta' => round($meta_periodo, 2),
            'progreso_porcentaje' => $progreso,
            'falta_vender' => round($falta, 2)
        ],
        'ventas' => [
            'total' => (float)$ventas['total'],
            'transacciones' => (int)$ventas['transacciones'],
            'efectivo' => (float)$ventas['efectivo'],
            'tarjeta' => (float)$ventas['tarjeta'],
            'descuentos' => (float)$ventas['descuentos'],
            'promedio' => $ventas['transacciones'] > 0 ? round((float)$ventas['total'] / (int)$ventas['transacciones'], 2) : 0
        ],
        'por_sucursal' => $por_sucursal,
        'utilidad' => $utilidad,
        'utilidad_neta' => $utilidad - ($gastos_op_total + $caja_chica),
        'gastos' => [
            'operativos' => $gastos_op_total,
            'caja_chica' => $caja_chica,
            'total' => $gastos_op_total + $caja_chica,
            'transacciones' => $gastos_op_transacciones
        ],
        'top_productos' => $top_productos,
        'ultimas_ventas' => $ultimas_ventas
    ]);
} catch (Exception $e) {
    json_error('Error: ' . $e->getMessage());
}
