<?php
/**
 * API: GestionPro - Obtener días, meses y detalles por día
 */
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

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

$action = $_GET['action'] ?? 'por_mes';

try {
    $pdo = getConnection();

    // ─────────────────────────────────────────────
    //  GET: Obtener meses disponibles
    // ─────────────────────────────────────────────
    if ($action === 'meses_disponibles') {
        $stmt = $pdo->query("
            SELECT DISTINCT YEAR(fecha_importacion) as anio, MONTH(fecha_importacion) as mes FROM fel_importaciones
            UNION
            SELECT DISTINCT YEAR(fecha) as anio, MONTH(fecha) as mes FROM factura_dias_pdf
            ORDER BY anio DESC, mes DESC
        ");
        $data = $stmt->fetchAll();
        echo json_encode(['success' => true, 'data' => $data]);
        exit;
    }

    // ─────────────────────────────────────────────
    //  GET: Listar días con datos por mes
    // ─────────────────────────────────────────────
    if ($action === 'por_mes') {
        $mes = intval($_GET['mes'] ?? date('m'));
        $anio = intval($_GET['anio'] ?? date('Y'));

        if ($mes < 1 || $mes > 12 || $anio < 2000) {
            throw new Exception("Parámetros de mes o año inválidos");
        }

        $startDate = sprintf("%04d-%02d-01 00:00:00", $anio, $mes);
        $endDate = date('Y-m-d 23:59:59', strtotime(sprintf("%04d-%02d-01", $anio, $mes) . ' +1 month -1 day'));

        $startOnlyDate = sprintf("%04d-%02d-01", $anio, $mes);
        $endOnlyDate = date('Y-m-d', strtotime($startOnlyDate . ' +1 month -1 day'));

        // 1. Obtener datos XML
        $stmtXml = $pdo->prepare("
            SELECT DATE(fecha_importacion) as fecha, 
                   COUNT(id) as total_hojas_xml,
                   COALESCE(SUM(total_facturas), 0) as total_facturas_xml, 
                   COALESCE(SUM(total_productos), 0) as total_productos, 
                   COALESCE(SUM(total_invertido), 0) as total_invertido
            FROM fel_importaciones
            WHERE fecha_importacion >= :start AND fecha_importacion <= :end
            GROUP BY DATE(fecha_importacion)
        ");
        $stmtXml->execute([':start' => $startDate, ':end' => $endDate]);
        $xmlData = $stmtXml->fetchAll();

        // 2. Obtener datos PDF
        $stmtPdf = $pdo->prepare("
            SELECT fecha, total_archivos as total_facturas_pdf, pdf_concatenado, supervisado
            FROM factura_dias_pdf
            WHERE fecha >= :start AND fecha <= :end
        ");
        $stmtPdf->execute([':start' => $startOnlyDate, ':end' => $endOnlyDate]);
        $pdfData = $stmtPdf->fetchAll();

        // 3. Unificar datos en un array asociativo por fecha
        $dias = [];

        foreach ($xmlData as $x) {
            $fecha = $x['fecha'];
            $dias[$fecha] = [
                'fecha' => $fecha,
                'total_hojas' => intval($x['total_hojas_xml']),
                'total_facturas_xml' => intval($x['total_facturas_xml']),
                'total_productos' => intval($x['total_productos']),
                'total_invertido' => floatval($x['total_invertido']),
                'total_facturas_pdf' => 0,
                'pdf_concatenado' => null,
                'supervisado' => 0
            ];
        }

        foreach ($pdfData as $p) {
            $fecha = $p['fecha'];
            if (!isset($dias[$fecha])) {
                $dias[$fecha] = [
                    'fecha' => $fecha,
                    'total_hojas' => 0,
                    'total_facturas_xml' => 0,
                    'total_productos' => 0,
                    'total_invertido' => 0.00,
                    'supervisado' => 0
                ];
            }
            $dias[$fecha]['total_facturas_pdf'] = intval($p['total_facturas_pdf']);
            // El path del PDF apunta al directorio sincnuevo/uploads/
            $dias[$fecha]['pdf_concatenado'] = $p['pdf_concatenado'] ? '../sincnuevo/' . $p['pdf_concatenado'] : null;
            $dias[$fecha]['supervisado'] = intval($p['supervisado']);
        }

        // Ordenar por fecha descendente
        krsort($dias);

        echo json_encode(['success' => true, 'data' => array_values($dias)]);
        exit;
    }

    // ─────────────────────────────────────────────
    //  GET: Obtener detalles de un día específico
    // ─────────────────────────────────────────────
    if ($action === 'detalle') {
        $fecha = $_GET['fecha'] ?? '';
        if (empty($fecha) || !preg_match('/^\d{4}-\d{2}-\d{2}$/', $fecha)) {
            throw new Exception("Fecha inválida o requerida");
        }

        $startDate = $fecha . " 00:00:00";
        $endDate = $fecha . " 23:59:59";

        $stmt = $pdo->prepare("
            SELECT fd.*, fi.fecha_importacion, lc.nombre as lugar_nombre
            FROM fel_importacion_detalle fd
            JOIN fel_importaciones fi ON fd.importacion_id = fi.id
            LEFT JOIN lugarcompra lc ON fd.lugar_compra_id = lc.id
            WHERE fi.fecha_importacion >= :start AND fi.fecha_importacion <= :end
            ORDER BY fd.proveedor_nombre ASC, fd.id ASC
        ");
        $stmt->execute([':start' => $startDate, ':end' => $endDate]);
        $data = $stmt->fetchAll(PDO::FETCH_ASSOC);

        // Preparar consultas de variantes
        $stmtVars = $pdo->prepare("
            SELECT dm.producto_id, dm.cantidad,
                   COALESCE(
                       (SELECT MAX(pp.fecha_actualizacion) FROM producto_presentaciones pp WHERE pp.producto_id = p.id),
                       dm.fecha_mapeo
                   ) as fecha_mapeo,
                   p.CodigoInterno, p.NombreComercial as maestro_nombre, p.NombreGenerico, p.CodigoBarra, p.laboratorio, p.exento_iva as es_exento,
                   COALESCE(
                       (SELECT plc.costo_compra FROM producto_lugares_compra plc WHERE plc.producto_id = p.id AND plc.lugar_compra_id = :lugar_id AND plc.fecha_ultima_compra = DATE(:fecha) LIMIT 1),
                       (SELECT plc.costo_compra FROM producto_lugares_compra plc WHERE plc.producto_id = p.id AND plc.lugar_compra_id = 1 AND plc.fecha_ultima_compra = DATE(:fecha) LIMIT 1)
                   ) as CostoGuardado,
                   COALESCE(pp_unidad.activo, 0) as ActivoUnidad,
                   COALESCE(pp_blister.activo, 0) as ActivoBlister,
                   COALESCE(pp_caja.activo, 0) as ActivoCaja,
                   COALESCE(pp_mixto.activo, 0) as ActivoMixto,
                   pp_blister.factor_conversion as FactorBlister,
                   pp_caja.factor_conversion as FactorCaja,
                   pp_mixto.factor_conversion as FactorMixto,
                   COALESCE(pp_unidad.precio_venta, 0) as PrecioVentaUnidad,
                   COALESCE(pp_blister.precio_venta, 0) as PrecioVentaBlister,
                   COALESCE(pp_caja.precio_venta, 0) as PrecioVentaMayor,
                   COALESCE(pp_mixto.precio_venta, 0) as PrecioVentaMixto
            FROM fel_importacion_detalle_mapeo dm
            JOIN productos p ON dm.producto_id = p.id
            LEFT JOIN producto_presentaciones pp_unidad ON p.id = pp_unidad.producto_id AND pp_unidad.presentacion_id = 1
            LEFT JOIN producto_presentaciones pp_blister ON p.id = pp_blister.producto_id AND pp_blister.presentacion_id = 2
            LEFT JOIN producto_presentaciones pp_caja ON p.id = pp_caja.producto_id AND pp_caja.presentacion_id = 3
            LEFT JOIN producto_presentaciones pp_mixto ON p.id = pp_mixto.producto_id AND pp_mixto.presentacion_id = 9
            WHERE dm.importacion_detalle_id = :det_id
        ");

        $stmtFallback = $pdo->prepare("
            SELECT m.producto_id, :cant as cantidad, m.fecha_mapeo,
                   p.CodigoInterno, p.NombreComercial as maestro_nombre, p.NombreGenerico, p.CodigoBarra, p.laboratorio, p.exento_iva as es_exento,
                   COALESCE(
                       (SELECT plc.costo_compra FROM producto_lugares_compra plc WHERE plc.producto_id = p.id AND plc.lugar_compra_id = :lugar_id AND plc.fecha_ultima_compra = DATE(:fecha) LIMIT 1),
                       (SELECT plc.costo_compra FROM producto_lugares_compra plc WHERE plc.producto_id = p.id AND plc.lugar_compra_id = 1 AND plc.fecha_ultima_compra = DATE(:fecha) LIMIT 1)
                   ) as CostoGuardado,
                   COALESCE(pp_unidad.activo, 0) as ActivoUnidad,
                   COALESCE(pp_blister.activo, 0) as ActivoBlister,
                   COALESCE(pp_caja.activo, 0) as ActivoCaja,
                   COALESCE(pp_mixto.activo, 0) as ActivoMixto,
                   pp_blister.factor_conversion as FactorBlister,
                   pp_caja.factor_conversion as FactorCaja,
                   pp_mixto.factor_conversion as FactorMixto,
                   COALESCE(pp_unidad.precio_venta, 0) as PrecioVentaUnidad,
                   COALESCE(pp_blister.precio_venta, 0) as PrecioVentaBlister,
                   COALESCE(pp_caja.precio_venta, 0) as PrecioVentaMayor,
                   COALESCE(pp_mixto.precio_venta, 0) as PrecioVentaMixto
            FROM fel_producto_mapping m
            JOIN productos p ON m.producto_id = p.id
            LEFT JOIN producto_presentaciones pp_unidad ON p.id = pp_unidad.producto_id AND pp_unidad.presentacion_id = 1
            LEFT JOIN producto_presentaciones pp_blister ON p.id = pp_blister.producto_id AND pp_blister.presentacion_id = 2
            LEFT JOIN producto_presentaciones pp_caja ON p.id = pp_caja.producto_id AND pp_caja.presentacion_id = 3
            LEFT JOIN producto_presentaciones pp_mixto ON p.id = pp_mixto.producto_id AND pp_mixto.presentacion_id = 9
            WHERE m.descripcion_factura = :desc
        ");

        $stmtPres = $pdo->prepare("
            SELECT pp.*, pr.nombre as presentacion_nombre 
            FROM producto_presentaciones pp
            JOIN presentaciones pr ON pp.presentacion_id = pr.id
            WHERE pp.producto_id = :pId
            ORDER BY pp.orden ASC, pp.presentacion_id ASC
        ");

        foreach ($data as &$r) {
            $stmtVars->execute([
                ':lugar_id' => $r['lugar_compra_id'],
                ':fecha' => $r['fecha_importacion'],
                ':det_id' => $r['id']
            ]);
            $variants = $stmtVars->fetchAll(PDO::FETCH_ASSOC);

            if (empty($variants)) {
                // Fallback a mapeo por descripción
                $stmtFallback->execute([
                    ':cant' => $r['cantidad_total'],
                    ':lugar_id' => $r['lugar_compra_id'],
                    ':fecha' => $r['fecha_importacion'],
                    ':desc' => $r['descripcion']
                ]);
                $variants = $stmtFallback->fetchAll(PDO::FETCH_ASSOC);
            }

            // Cargar presentaciones para cada variante
            foreach ($variants as &$v) {
                $stmtPres->execute([':pId' => $v['producto_id']]);
                $v['presentaciones'] = $stmtPres->fetchAll(PDO::FETCH_ASSOC);
            }

            $r['variantes'] = $variants;

            // Mantener compatibilidad de campos raíz
            if (count($variants) === 1) {
                $v = $variants[0];
                $r['producto_id'] = $v['producto_id'];
                $r['CodigoInterno'] = $v['CodigoInterno'];
                $r['maestro_nombre'] = $v['maestro_nombre'];
                $r['NombreGenerico'] = $v['NombreGenerico'];
                $r['CodigoBarra'] = $v['CodigoBarra'];
                $r['laboratorio'] = $v['laboratorio'];
                $r['CostoGuardado'] = $v['CostoGuardado'];
                $r['fecha_mapeo'] = $v['fecha_mapeo'];
                $r['presentaciones'] = $v['presentaciones'];
            } elseif (count($variants) > 1) {
                $r['producto_id'] = 'MULTIPLE';
                $r['CodigoInterno'] = 'MULTIPLE';
                $r['maestro_nombre'] = count($variants) . ' variantes';
                $r['presentaciones'] = [];
            } else {
                $r['producto_id'] = null;
                $r['presentaciones'] = [];
            }
        }

        echo json_encode(['success' => true, 'data' => $data]);
        exit;
    }

    throw new Exception("Acción no válida");

} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
