<?php

/**
 * Promociones.php - Manejo de promociones y degustaciones
 * Sistema para registrar productos entregados sin costo
 */

// Función para enviar respuesta JSON
if (!function_exists('sendResponse')) {
    function sendResponse($success, $message = '', $data = null)
    {
        echo json_encode([
            "success" => $success,
            "message" => $message,
            "data" => $data
        ]);
        exit;
    }
}

// === REGISTRAR PROMOCIÓN ===
if ($tipo === 'registrarPromocion') {
    error_log("=== REGISTRANDO PROMOCIÓN ===");

    // Obtener token del repartidor
    $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
    if (empty($authHeader)) {
        $headers = getallheaders();
        $authHeader = $headers['Authorization'] ?? $headers['X-Auth-Token'] ?? '';
    }

    if (empty($authHeader)) {
        // Intentar obtener de X-Auth-Token
        $authHeader = $_SERVER['HTTP_X_AUTH_TOKEN'] ?? '';
    }

    if (empty($authHeader)) {
        sendResponse(false, "Token de autenticación requerido");
    }

    $token = str_replace('Bearer ', '', $authHeader);

    // Verificar token y obtener repartidor_id
    require_once __DIR__ . '/../../modelos/Auth.php';
    $auth = new Auth($conn);
    $payload = $auth->verificarJWT($token);

    if (!$payload) {
        sendResponse(false, "Token inválido o expirado");
    }

    $repartidorId = $payload['repartidor_id'] ?? null;
    if (!$repartidorId) {
        sendResponse(false, "Token no válido para repartidor");
    }

    // Obtener parámetros
    $clienteId = isset($datapost['cliente_id']) ? (int)$datapost['cliente_id'] : 0;
    $visitaId = isset($datapost['visita_id']) ? (int)$datapost['visita_id'] : null;
    $productos = isset($datapost['productos']) ? $datapost['productos'] : [];
    $totalItems = isset($datapost['total_items']) ? (int)$datapost['total_items'] : 0;
    $notas = isset($datapost['notas']) ? $datapost['notas'] : '';

    if ($clienteId <= 0) {
        sendResponse(false, "ID de cliente requerido");
    }

    if (empty($productos)) {
        sendResponse(false, "Debe incluir al menos un producto para la promoción");
    }

    try {
        error_log("Registrando promoción: Cliente ID=$clienteId, Productos=" . count($productos));

        // Iniciar transacción
        $conn->beginTransaction();

        // Generar folio único
        $fechaHoy = date('Ymd');
        $queryFolio = "SELECT COUNT(*) + 1 as siguiente FROM promociones WHERE DATE(fecha_promocion) = CURDATE()";
        $stmtFolio = $conn->prepare($queryFolio);
        $stmtFolio->execute();
        $siguiente = $stmtFolio->fetch(PDO::FETCH_ASSOC)['siguiente'];
        $folio = "PROMO-{$fechaHoy}-" . str_pad($siguiente, 4, '0', STR_PAD_LEFT);

        // Crear registro de promoción
        $queryPromocion = "INSERT INTO promociones (
                            folio,
                            repartidor_id,
                            cliente_id,
                            visita_id,
                            fecha_promocion,
                            hora_promocion,
                            total_items,
                            estado,
                            notas,
                            created_at
                        ) VALUES (
                            :folio,
                            :repartidor_id,
                            :cliente_id,
                            :visita_id,
                            CURDATE(),
                            CURTIME(),
                            :total_items,
                            'completado',
                            :notas,
                            NOW()
                        )";

        $stmtPromocion = $conn->prepare($queryPromocion);
        $stmtPromocion->bindParam(':folio', $folio);
        $stmtPromocion->bindParam(':repartidor_id', $repartidorId);
        $stmtPromocion->bindParam(':cliente_id', $clienteId);
        $stmtPromocion->bindParam(':visita_id', $visitaId);
        $stmtPromocion->bindParam(':total_items', $totalItems);
        $stmtPromocion->bindParam(':notas', $notas);
        $stmtPromocion->execute();

        $promocionId = $conn->lastInsertId();
        error_log("Promoción creada con ID: $promocionId, Folio: $folio");

        // Insertar detalle de productos
        $queryDetalle = "INSERT INTO promociones_detalle (
                            promocion_id,
                            producto_id,
                            cantidad,
                            tipo_promocion,
                            descripcion
                        ) VALUES (
                            :promocion_id,
                            :producto_id,
                            :cantidad,
                            :tipo_promocion,
                            :descripcion
                        )";

        $stmtDetalle = $conn->prepare($queryDetalle);

        foreach ($productos as $producto) {
            $productoId = (int)$producto['producto_id'];
            $cantidad = (int)$producto['cantidad'];
            $tipoPromocion = $producto['tipo_promocion'] ?? 'degustacion';
            $descripcion = $producto['descripcion'] ?? '';

            $stmtDetalle->bindParam(':promocion_id', $promocionId);
            $stmtDetalle->bindParam(':producto_id', $productoId);
            $stmtDetalle->bindParam(':cantidad', $cantidad);
            $stmtDetalle->bindParam(':tipo_promocion', $tipoPromocion);
            $stmtDetalle->bindParam(':descripcion', $descripcion);
            $stmtDetalle->execute();

            error_log("Detalle promoción: Producto $productoId, Cantidad $cantidad, Tipo $tipoPromocion");

            // Descontar del inventario del repartidor
            $queryDescuento = "UPDATE inventarios_repartidor
                              SET cantidad = cantidad - :cantidad,
                                  updated_at = NOW()
                              WHERE repartidor_id = :repartidor_id
                              AND producto_id = :producto_id
                              AND cantidad >= :cantidad2";

            $stmtDescuento = $conn->prepare($queryDescuento);
            $stmtDescuento->bindParam(':cantidad', $cantidad);
            $stmtDescuento->bindParam(':repartidor_id', $repartidorId);
            $stmtDescuento->bindParam(':producto_id', $productoId);
            $stmtDescuento->bindParam(':cantidad2', $cantidad);
            $stmtDescuento->execute();

            // Registrar movimiento de inventario
            $queryMovimiento = "INSERT INTO movimientos_inventario_repartidor (
                                    repartidor_id,
                                    producto_id,
                                    tipo_movimiento,
                                    cantidad,
                                    notas,
                                    created_at
                                ) VALUES (
                                    :repartidor_id,
                                    :producto_id,
                                    'ajuste_decremento',
                                    :cantidad,
                                    :notas,
                                    NOW()
                                )";

            $notaMovimiento = "Promoción/Degustación - Folio: $folio - ID: $promocionId";
            $stmtMovimiento = $conn->prepare($queryMovimiento);
            $stmtMovimiento->bindParam(':repartidor_id', $repartidorId);
            $stmtMovimiento->bindParam(':producto_id', $productoId);
            $stmtMovimiento->bindParam(':cantidad', $cantidad);
            $stmtMovimiento->bindParam(':notas', $notaMovimiento);
            $stmtMovimiento->execute();
        }

        // Confirmar transacción
        $conn->commit();

        error_log("✅ Promoción registrada exitosamente: $folio");

        sendResponse(true, "Promoción registrada exitosamente", [
            'promocion_id' => $promocionId,
            'folio' => $folio,
            'total_items' => $totalItems,
            'fecha' => date('Y-m-d H:i:s')
        ]);

    } catch (Exception $e) {
        $conn->rollBack();
        error_log("❌ Error registrando promoción: " . $e->getMessage());
        sendResponse(false, "Error al registrar la promoción: " . $e->getMessage());
    }
}

// === OBTENER HISTORIAL DE PROMOCIONES ===
if ($tipo === 'getHistorialPromociones') {
    error_log("=== OBTENIENDO HISTORIAL DE PROMOCIONES ===");

    try {
        $repartidorId = isset($datapost['repartidor_id']) ? (int)$datapost['repartidor_id'] : null;
        $clienteId = isset($datapost['cliente_id']) ? (int)$datapost['cliente_id'] : null;
        $fechaDesde = isset($datapost['fecha_desde']) ? $datapost['fecha_desde'] : null;
        $fechaHasta = isset($datapost['fecha_hasta']) ? $datapost['fecha_hasta'] : null;
        $limite = isset($datapost['limite']) ? (int)$datapost['limite'] : 50;

        $query = "SELECT p.*,
                         c.nombre as cliente_nombre,
                         c.nombre_comercial as cliente_comercial,
                         r.nombre as repartidor_nombre
                  FROM promociones p
                  LEFT JOIN clientes c ON p.cliente_id = c.id
                  LEFT JOIN repartidores r ON p.repartidor_id = r.id
                  WHERE 1=1";

        $params = [];

        if ($repartidorId) {
            $query .= " AND p.repartidor_id = :repartidor_id";
            $params[':repartidor_id'] = $repartidorId;
        }

        if ($clienteId) {
            $query .= " AND p.cliente_id = :cliente_id";
            $params[':cliente_id'] = $clienteId;
        }

        if ($fechaDesde) {
            $query .= " AND p.fecha_promocion >= :fecha_desde";
            $params[':fecha_desde'] = $fechaDesde;
        }

        if ($fechaHasta) {
            $query .= " AND p.fecha_promocion <= :fecha_hasta";
            $params[':fecha_hasta'] = $fechaHasta;
        }

        $query .= " ORDER BY p.created_at DESC LIMIT :limite";

        $stmt = $conn->prepare($query);

        foreach ($params as $key => $value) {
            $stmt->bindValue($key, $value);
        }
        $stmt->bindValue(':limite', $limite, PDO::PARAM_INT);

        $stmt->execute();
        $promociones = $stmt->fetchAll(PDO::FETCH_ASSOC);

        // Obtener productos para cada promoción
        foreach ($promociones as &$promocion) {
            $queryProductos = "SELECT
                                pd.id,
                                pd.producto_id,
                                pr.codigo,
                                pr.nombre as producto_nombre,
                                pd.cantidad,
                                pd.tipo_promocion
                            FROM promociones_detalle pd
                            LEFT JOIN productos pr ON pd.producto_id = pr.id
                            WHERE pd.promocion_id = :promocion_id";

            $stmtProd = $conn->prepare($queryProductos);
            $stmtProd->bindParam(':promocion_id', $promocion['id']);
            $stmtProd->execute();
            $promocion['productos'] = $stmtProd->fetchAll(PDO::FETCH_ASSOC);
        }

        sendResponse(true, "Historial de promociones obtenido", $promociones);

    } catch (Exception $e) {
        error_log("Error obteniendo historial de promociones: " . $e->getMessage());
        sendResponse(false, "Error al obtener el historial: " . $e->getMessage());
    }
}

// === OBTENER DETALLE DE PROMOCIÓN ===
if ($tipo === 'getDetallePromocion') {
    error_log("=== OBTENIENDO DETALLE DE PROMOCIÓN ===");

    $promocionId = isset($datapost['promocion_id']) ? (int)$datapost['promocion_id'] : 0;

    if ($promocionId <= 0) {
        sendResponse(false, "ID de promoción requerido");
    }

    try {
        // Obtener datos de la promoción
        $queryPromocion = "SELECT p.*,
                                  c.nombre as cliente_nombre,
                                  c.nombre_comercial as cliente_comercial,
                                  c.direccion as cliente_direccion,
                                  r.nombre as repartidor_nombre
                           FROM promociones p
                           LEFT JOIN clientes c ON p.cliente_id = c.id
                           LEFT JOIN repartidores r ON p.repartidor_id = r.id
                           WHERE p.id = :promocion_id";

        $stmtPromocion = $conn->prepare($queryPromocion);
        $stmtPromocion->bindParam(':promocion_id', $promocionId);
        $stmtPromocion->execute();
        $promocion = $stmtPromocion->fetch(PDO::FETCH_ASSOC);

        if (!$promocion) {
            sendResponse(false, "Promoción no encontrada");
        }

        // Obtener detalle de productos
        $queryDetalle = "SELECT pd.*,
                                pr.nombre as producto_nombre,
                                pr.codigo as producto_codigo
                         FROM promociones_detalle pd
                         LEFT JOIN productos pr ON pd.producto_id = pr.id
                         WHERE pd.promocion_id = :promocion_id";

        $stmtDetalle = $conn->prepare($queryDetalle);
        $stmtDetalle->bindParam(':promocion_id', $promocionId);
        $stmtDetalle->execute();
        $detalle = $stmtDetalle->fetchAll(PDO::FETCH_ASSOC);

        $promocion['productos'] = $detalle;

        sendResponse(true, "Detalle de promoción obtenido", $promocion);

    } catch (Exception $e) {
        error_log("Error obteniendo detalle de promoción: " . $e->getMessage());
        sendResponse(false, "Error al obtener el detalle: " . $e->getMessage());
    }
}

// === CANCELAR PROMOCIÓN ===
if ($tipo === 'cancelarPromocion') {
    error_log("=== CANCELANDO PROMOCIÓN ===");

    $promocionId = isset($datapost['promocion_id']) ? (int)$datapost['promocion_id'] : 0;
    $motivo = isset($datapost['motivo']) ? $datapost['motivo'] : '';

    if ($promocionId <= 0) {
        sendResponse(false, "ID de promoción requerido");
    }

    try {
        $conn->beginTransaction();

        // Verificar que la promoción existe y está activa
        $queryVerificar = "SELECT * FROM promociones WHERE id = :id AND estado = 'completado'";
        $stmtVerificar = $conn->prepare($queryVerificar);
        $stmtVerificar->bindParam(':id', $promocionId);
        $stmtVerificar->execute();
        $promocion = $stmtVerificar->fetch(PDO::FETCH_ASSOC);

        if (!$promocion) {
            sendResponse(false, "Promoción no encontrada o ya cancelada");
        }

        // Obtener productos para revertir inventario
        $queryProductos = "SELECT * FROM promociones_detalle WHERE promocion_id = :promocion_id";
        $stmtProductos = $conn->prepare($queryProductos);
        $stmtProductos->bindParam(':promocion_id', $promocionId);
        $stmtProductos->execute();
        $productos = $stmtProductos->fetchAll(PDO::FETCH_ASSOC);

        // Revertir inventario
        foreach ($productos as $producto) {
            $queryRevertir = "UPDATE inventarios_repartidor
                             SET cantidad = cantidad + :cantidad,
                                 updated_at = NOW()
                             WHERE repartidor_id = :repartidor_id
                             AND producto_id = :producto_id";

            $stmtRevertir = $conn->prepare($queryRevertir);
            $stmtRevertir->bindParam(':cantidad', $producto['cantidad']);
            $stmtRevertir->bindParam(':repartidor_id', $promocion['repartidor_id']);
            $stmtRevertir->bindParam(':producto_id', $producto['producto_id']);
            $stmtRevertir->execute();
        }

        // Actualizar estado de la promoción
        $queryCancelar = "UPDATE promociones
                         SET estado = 'cancelado',
                             notas = CONCAT(IFNULL(notas, ''), ' | CANCELADO: ', :motivo),
                             updated_at = NOW()
                         WHERE id = :id";

        $stmtCancelar = $conn->prepare($queryCancelar);
        $stmtCancelar->bindParam(':motivo', $motivo);
        $stmtCancelar->bindParam(':id', $promocionId);
        $stmtCancelar->execute();

        $conn->commit();

        sendResponse(true, "Promoción cancelada exitosamente", [
            'promocion_id' => $promocionId,
            'folio' => $promocion['folio']
        ]);

    } catch (Exception $e) {
        $conn->rollBack();
        error_log("Error cancelando promoción: " . $e->getMessage());
        sendResponse(false, "Error al cancelar la promoción: " . $e->getMessage());
    }
}
