<?php
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../config/db.php';

/**
 * API: Desglosar un registro de importación en múltiples registros
 * POST JSON: { id_original, desgloses: [ { cantidad, producto_id, codigo, nombre }, ... ] }
 */

try {
    $pdo = getConnection();
    $data = json_decode(file_get_contents('php://input'), true);
    
    $idOriginal = intval($data['id_original'] ?? 0);
    $desgloses = $data['desgloses'] ?? [];

    if ($idOriginal <= 0 || empty($desgloses)) {
        throw new Exception('Datos incompletos para el desglose');
    }

    $pdo->beginTransaction();

    // 1. Obtener el registro original
    $stmt = $pdo->prepare("SELECT * FROM fel_importacion_detalle WHERE id = :id");
    $stmt->execute([':id' => $idOriginal]);
    $orig = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$orig) {
        throw new Exception('Registro original no encontrado');
    }

    $cantTotalOrig = floatval($orig['cantidad_total']);
    $totalPagadoOrig = floatval($orig['total_pagado']);
    $costoUnitario = $orig['costo_real_unitario'];
    
    // Validar suma de cantidades
    $sumaCant = array_reduce($desgloses, fn($s, $d) => $s + floatval($d['cantidad']), 0);
    
    // Permitir una pequeña tolerancia por decimales
    if (abs($sumaCant - $cantTotalOrig) > 0.01) {
        throw new Exception("La suma de las cantidades ({$sumaCant}) debe ser igual al total original ({$cantTotalOrig})");
    }

    // 2. Preparar inserción de nuevos registros
    $stmtInsert = $pdo->prepare("
        INSERT INTO fel_importacion_detalle 
            (importacion_id, lugar_compra_id, proveedor_nombre, numero_autorizacion, descripcion, 
             cantidad_total, cantidad_bonificada, costo_real_unitario, precio_original, 
             total_pagado, tiene_bonificacion, consolidado, es_exento, fecha_factura)
        VALUES 
            (:imp_id, :lugar_id, :prov, :num_fac, :desc, 
             :cant, :cant_bonif, :costo, :p_orig, 
             :total, :tiene_bonif, :consolidado, :es_exento, :fecha)
    ");

    $stmtMapping = $pdo->prepare("
        INSERT INTO fel_producto_mapping (descripcion_factura, producto_id)
        VALUES (:desc, :pid)
        ON DUPLICATE KEY UPDATE producto_id = :pid
    ");

    foreach ($desgloses as $d) {
        $cant = floatval($d['cantidad']);
        $ratio = $cant / $cantTotalOrig;
        
        $totalPagado = round($totalPagadoOrig * $ratio, 2);
        $cantBonif = round(floatval($orig['cantidad_bonificada']) * $ratio, 2);

        $stmtInsert->execute([
            ':imp_id'       => $orig['importacion_id'],
            ':lugar_id'     => $orig['lugar_compra_id'],
            ':prov'         => $orig['proveedor_nombre'],
            ':num_fac'      => $orig['numero_autorizacion'],
            ':desc'         => $orig['descripcion'],
            ':cant'         => $cant,
            ':cant_bonif'   => $cantBonif,
            ':costo'        => $costoUnitario,
            ':p_orig'       => $orig['precio_original'],
            ':total'        => $totalPagado,
            ':tiene_bonif'  => ($cantBonif > 0 ? 1 : 0),
            ':consolidado'  => $orig['consolidado'],
            ':es_exento'    => $orig['es_exento'],
            ':fecha'        => $orig['fecha_factura']
        ]);

        // Si el desglose viene con un producto_id, crear/actualizar el mapping
        if (!empty($d['producto_id'])) {
            $stmtMapping->execute([
                ':desc' => $orig['descripcion'],
                ':pid' => $d['producto_id']
            ]);
        }
    }

    // 3. Eliminar el registro original (ya fue reemplazado por sus desgloses)
    $stmtDelete = $pdo->prepare("DELETE FROM fel_importacion_detalle WHERE id = :id");
    $stmtDelete->execute([':id' => $idOriginal]);

    $pdo->commit();
    echo json_encode(['success' => true, 'message' => 'Desglose aplicado correctamente']);

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