<?php
/**
 * API: Guardar mapeo de múltiples variantes para un detalle de importación
 * POST JSON: { importacion_detalle_id: 123, variantes: [ { producto_id: 456, cantidad: 3.00 }, ... ] }
 */
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../config/db.php';

try {
    $data = json_decode(file_get_contents('php://input'), true);

    if (!$data || !isset($data['importacion_detalle_id']) || !isset($data['variantes']) || !is_array($data['variantes'])) {
        throw new Exception('Datos incompletos o inválidos');
    }

    $detId = intval($data['importacion_detalle_id']);
    $variantes = $data['variantes'];

    if ($detId <= 0) {
        throw new Exception('ID de detalle de importación inválido');
    }

    $pdo = getConnection();
    $pdo->beginTransaction();

    // 1. Obtener cantidad total del registro original para validar
    $stmtOrig = $pdo->prepare("SELECT cantidad_total FROM fel_importacion_detalle WHERE id = :id");
    $stmtOrig->execute([':id' => $detId]);
    $origRow = $stmtOrig->fetch(PDO::FETCH_ASSOC);

    if (!$origRow) {
        throw new Exception('El registro de detalle de importación no existe');
    }

    $cantTotalFactura = floatval($origRow['cantidad_total']);
    
    // 2. Calcular la suma de cantidades asignadas
    $sumCantidades = 0.0;
    foreach ($variantes as $var) {
        $qty = floatval($var['cantidad'] ?? 0);
        if ($qty <= 0) {
            throw new Exception('La cantidad de cada variante debe ser mayor a 0');
        }
        $sumCantidades += $qty;
    }

    // Permitir guardar vacío (desvincular) o validar que no exceda el total
    if (count($variantes) > 0 && abs($sumCantidades - $cantTotalFactura) > 0.01) {
        throw new Exception("La suma de las cantidades de las variantes ($sumCantidades) debe ser igual a la cantidad total del item en la factura ($cantTotalFactura)");
    }

    // 3. Eliminar mapeos de variantes existentes para este item
    $stmtDelete = $pdo->prepare("DELETE FROM fel_importacion_detalle_mapeo WHERE importacion_detalle_id = :det_id");
    $stmtDelete->execute([':det_id' => $detId]);

    // 4. Insertar las nuevas variantes si no está vacío
    if (count($variantes) > 0) {
        // Eliminar mapeo por descripción global para evitar que contamine otras filas no desglosadas
        $stmtDesc = $pdo->prepare("SELECT descripcion FROM fel_importacion_detalle WHERE id = :id");
        $stmtDesc->execute([':id' => $detId]);
        $descVal = $stmtDesc->fetchColumn();
        if ($descVal) {
            $stmtDelMap = $pdo->prepare("DELETE FROM fel_producto_mapping WHERE descripcion_factura = :desc");
            $stmtDelMap->execute([':desc' => $descVal]);
        }

        $stmtInsert = $pdo->prepare("
            INSERT INTO fel_importacion_detalle_mapeo (importacion_detalle_id, producto_id, cantidad)
            VALUES (:det_id, :prod_id, :cant)
        ");

        foreach ($variantes as $var) {
            $stmtInsert->execute([
                ':det_id'  => $detId,
                ':prod_id' => intval($var['producto_id']),
                ':cant'    => floatval($var['cantidad'])
            ]);
        }
    }

    $pdo->commit();
    echo json_encode([
        'success' => true,
        'message' => 'Mapeo de variantes guardado correctamente'
    ]);

} catch (Exception $e) {
    if (isset($pdo) && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => $e->getMessage()
    ]);
}
?>
