<?php
/**
 * compra-debug.php
 * POST → Recibe el mismo payload que compra-guardar.php
 *        pero en lugar de ejecutar los inserts, los devuelve como texto
 *        para revisión. NO modifica la base de datos.
 */
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Authorization, Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['ok' => false, 'error' => 'Método no permitido']);
    exit;
}

require_once __DIR__ . '/../../config.php';
$db = getDB();

// ── Validar token admin ───────────────────────────────────────────────────────
$headers    = getallheaders();
$authHeader = $headers['Authorization'] ?? $headers['authorization'] ?? '';
if (!preg_match('/Bearer\s+(.+)/i', $authHeader, $m)) {
    http_response_code(401);
    echo json_encode(['ok' => false, 'error' => 'Token requerido']);
    exit;
}
$token = trim($m[1]);
$stmtTok = $db->prepare("SELECT idusuarios_sist FROM admin_sessions WHERE token = ? AND expira > NOW()");
$stmtTok->execute([$token]);
if (!$stmtTok->fetch()) {
    http_response_code(401);
    echo json_encode(['ok' => false, 'error' => 'Sesión inválida o expirada']);
    exit;
}

// ── Leer payload ──────────────────────────────────────────────────────────────
$b = json_decode(file_get_contents('php://input'), true) ?? [];

$cdId      = (int)($b['cd_id']     ?? 0);
$idinv     = (int)($b['id_inv']    ?? 0);
$tipoBase  = (int)($b['tipo_nota'] ?? 10);
$items     = $b['items']  ?? [];
$pagos     = $b['pagos']  ?? [];
$cdentrega = (int)($b['cdentrega'] ?? 8);

$envioData            = $b['envio'] ?? [];
$costoEnvio           = (int)round((float)($envioData['costo_envio'] ?? $b['costo_envio'] ?? 0));
$tipoEnvio            = $envioData['tipo'] ?? 'gratis';
$skydropxCotizacionId = $envioData['cotizacion_id'] ?? null;
$skydropxRateId       = $envioData['rate_id']       ?? null;
$carrier              = $envioData['carrier']        ?? null;
$contactoTel          = trim($envioData['contacto_tel'] ?? $b['contacto_tel'] ?? '');
$direccionEnvio       = $envioData['direccion']      ?? null;
$idDireccionEnvio     = isset($envioData['id_direccion']) ? (int)$envioData['id_direccion'] : (isset($b['id_direccion_envio']) ? (int)$b['id_direccion_envio'] : null);
$guardarDir           = !empty($envioData['guardar_dir']);
$dirData              = $envioData['direccion'] ?? [];

// ── Calcular totales ──────────────────────────────────────────────────────────
$subtotalProductos = 0;
$totalPuntos       = 0;
foreach ($items as $item) {
    $precio   = (float)($item['precio']   ?? 0);
    $puntos   = (float)($item['puntos']   ?? 0);
    $cantidad = (int)($item['cantidad']   ?? 1);
    $subtotalProductos += $precio * $cantidad;
    if ($tipoBase === 10) $totalPuntos += $puntos * $cantidad;
}
$totalVenta = $subtotalProductos + $costoEnvio;

// ── Desglosar pagos ───────────────────────────────────────────────────────────
$ef = 0; $dep = 0; $tar = 0; $vou = 0;
foreach ($pagos as $pago) {
    $monto = (float)($pago['monto'] ?? 0);
    $met   = $pago['metodo'] ?? '';
    if ($met === 'efectivo')          $ef  += $monto;
    elseif ($met === 'deposito')      $dep += $monto;
    elseif ($met === 'transferencia') $dep += $monto;
    elseif ($met === 'tarjeta')       $tar += $monto;
    elseif ($met === 'voucher')       $vou += $monto;
}
// Si no hay pagos, NO asignar nada — quedará como porpagar = totalVenta

// ── Determinar tipo de nota y si el pago está confirmado ─────────────────────
$hayPagos      = ($ef + $dep + $tar + $vou) > 0;
$totalPagado   = $ef + $dep + $tar + $vou;

// Calcular porpagar primero
if (!$hayPagos) {
    $efPago = 0; $depPago = 0; $tarPago = 0; $vouPago = 0;
    $porpagar = $totalVenta;
} else {
    $efPago = $ef; $depPago = $dep; $tarPago = $tar; $vouPago = $vou;
    $porpagar = max(0, $totalVenta - $totalPagado);
}

// Tipo real: 10/11 solo si porpagar=0, de lo contrario 7/8
$pagoCompleto = ($porpagar == 0 && $hayPagos);
if ($tipoBase === 10) $tipo = $pagoCompleto ? 10 : 7;
else                  $tipo = $pagoCompleto ? 11 : 8;

// ── Obtener consecutivo actual (solo lectura) ─────────────────────────────────
$stmtC = $db->prepare('SELECT consec FROM cdconsec WHERE idcd = ?');
$stmtC->execute([$cdId]);
$consecActual = (int)($stmtC->fetchColumn() ?: 0);
$consecSiguiente = $consecActual + 1;

// ── Obtener nombre del distribuidor ──────────────────────────────────────────
$stmtInv = $db->prepare('SELECT nombre, appat, apmat, email FROM inversionista WHERE id_inver = ?');
$stmtInv->execute([$idinv]);
$inv = $stmtInv->fetch(PDO::FETCH_ASSOC);
$nombreDist = trim(($inv['nombre'] ?? '') . ' ' . ($inv['appat'] ?? '') . ' ' . ($inv['apmat'] ?? ''));

// ── Obtener nombre del centro ─────────────────────────────────────────────────
$stmtCd = $db->prepare('SELECT nombre FROM usuarios_ci WHERE idusuarios_ci = ?');
$stmtCd->execute([$cdId]);
$nombreCd = $stmtCd->fetchColumn() ?: "Centro #$cdId";

// ── Construir lista de inserts/consultas ──────────────────────────────────────
$fecha   = date('Y-m-d');
$hora    = date('H:i:s');
$idTxSim = '[AUTO_INCREMENT]';

$queries = [];

// RESUMEN
$queries[] = [
    'tipo'        => 'RESUMEN',
    'descripcion' => 'Datos calculados antes de guardar',
    'valores'     => [
        'Centro generador'     => "$cdId — $nombreCd",
        'Distribuidor'         => "$idinv — $nombreDist",
        'Tipo base solicitado' => $tipoBase,
        'Tipo nota real'       => "$tipo (" . ($pagoCompleto ? 'pago confirmado' : 'pago pendiente') . ")",
        'Subtotal productos'   => number_format($subtotalProductos, 2),
        'Costo envío'          => number_format($costoEnvio, 2),
        'Total venta'          => number_format($totalVenta, 2),
        'Efectivo'             => number_format($ef, 2),
        'Depósito'             => number_format($dep, 2),
        'Tarjeta'              => number_format($tar, 2),
        'Voucher'              => number_format($vou, 2),
        'Por pagar'            => number_format($porpagar, 2),
        'Puntos'               => $totalPuntos,
        'Consecutivo siguiente'=> $consecSiguiente,
        'Centro entrega'       => $cdentrega,
        'Tipo envío'           => $tipoEnvio,
    ],
];

// 0. cdconsec
$queries[] = [
    'tipo'  => 'UPDATE',
    'tabla' => 'cdconsec',
    'sql'   => "INSERT INTO cdconsec (idcd, consec) VALUES ($cdId, $consecSiguiente) ON DUPLICATE KEY UPDATE consec=$consecSiguiente",
    'nota'  => "Actualiza el consecutivo del centro $cdId de $consecActual a $consecSiguiente",
];

// 1. transacciones
$queries[] = [
    'tipo'  => 'INSERT',
    'tabla' => 'transacciones',
    'sql'   => "INSERT INTO transacciones (inversionista_id_inver, tipostr_idtipostr, fechat, horat, usuarios_ci_idusuarios_ci, consec, cdentrega, statusentrega) VALUES ($idinv, $tipo, '$fecha', '$hora', $cdId, $consecSiguiente, $cdentrega, 'PENDIENTE')",
    'nota'  => "Genera idtransacciones = $idTxSim",
];

// 2. depositos
$puntosDeposito = ($tipoBase === 10) ? $totalPuntos : 0;
$queries[] = [
    'tipo'  => 'INSERT',
    'tabla' => 'depositos',
    'sql'   => "INSERT INTO depositos (centros_idcd, transacciones_idtransacciones, cantidad, puntos) VALUES ($cdId, $idTxSim, $totalVenta, $puntosDeposito)",
];

// 3. pagovta
$queries[] = [
    'tipo'  => 'INSERT',
    'tabla' => 'pagovta',
    'sql'   => "INSERT INTO pagovta (idtransacciones, efectivo, deposito, tarjeta, voucher, porpagar, abono) VALUES ($idTxSim, $efPago, $depPago, $tarPago, $vouPago, $porpagar, 0)",
];

// 4a. depositos_transaccion — tarjeta
if ($tar > 0) {
    $folioMP = 'MP' . time();
    $queries[] = [
        'tipo'  => 'INSERT',
        'tabla' => 'depositos_transaccion',
        'sql'   => "INSERT INTO depositos_transaccion (idtransacciones, tipo, monto, folio, idbanco, fecha) VALUES ($idTxSim, 2, $tar, '$folioMP', 42, '$fecha $hora')",
        'nota'  => 'Registro de pago con tarjeta (banco 42 = Mercado Pago)',
    ];
}

// 4b. depositos_transaccion — depósitos bancarios
foreach ($pagos as $pago) {
    if (($pago['metodo'] ?? '') !== 'deposito') continue;
    $montoDep  = (float)($pago['monto']   ?? 0);
    $idbancoD  = (int)($pago['idbanco']   ?? 0);
    $folioD    = trim($pago['folio']       ?? '');
    $fechaDepR = trim($pago['fecha']       ?? '');
    if ($montoDep <= 0 || !$idbancoD || $folioD === '') continue;
    $fechaDepDT = $fechaDepR ? ($fechaDepR . ' 00:00:00') : ($fecha . ' ' . $hora);
    $queries[] = [
        'tipo'  => 'INSERT',
        'tabla' => 'depositos_transaccion',
        'sql'   => "INSERT INTO depositos_transaccion (idtransacciones, tipo, monto, folio, idbanco, fecha) VALUES ($idTxSim, 2, $montoDep, '$folioD', $idbancoD, '$fechaDepDT')",
        'nota'  => "Depósito bancario — banco ID $idbancoD",
    ];
}

// 5. pedido_real + pedido + nsalida
foreach ($items as $item) {
    $tipoItem = $item['tipo'] ?? 'producto';
    $cantidad = (int)($item['cantidad'] ?? 1);
    $esPaq    = ($tipoItem === 'paquete' || $tipoItem === 'promo');
    $idItem   = (int)($item['id_prod'] ?? 0);
    $nomItem  = $item['nombre'] ?? "ID $idItem";

    $queries[] = [
        'tipo'  => 'INSERT',
        'tabla' => 'pedido_real',
        'sql'   => "INSERT INTO pedido_real (transacciones, id_prod, cant) VALUES ($idTxSim, $idItem, $cantidad)",
        'nota'  => "Producto: $nomItem",
    ];

    if ($esPaq) {
        // Consultar los productos de la promo (solo lectura para mostrar)
        try {
            $stmtPP = $db->prepare('SELECT pp.idprodp AS id_prod, pp.cantp AS cq, p.nombreProd AS nombre FROM promop pp LEFT JOIN productos p ON p.id_prod = pp.idprodp WHERE pp.promop = ?');
            $stmtPP->execute([$idItem]);
            $promItems = $stmtPP->fetchAll(PDO::FETCH_ASSOC);
        } catch (Exception $ePP) {
            $promItems = [];
            $queries[] = ['tipo' => 'ADVERTENCIA', 'tabla' => 'promop', 'sql' => 'Error al consultar productos de promo ID '.$idItem.': '.$ePP->getMessage(), 'nota' => ''];
        }
        foreach ($promItems as $pItem) {
            $cantProd = (int)$pItem['cq'] * $cantidad;
            $nomProd  = $pItem['nombre'] ?? "ID {$pItem['id_prod']}";
            $queries[] = [
                'tipo'  => 'INSERT',
                'tabla' => 'pedido',
                'sql'   => "INSERT INTO pedido (transacciones_idtransacciones, productos_idprod, cant) VALUES ($idTxSim, {$pItem['id_prod']}, $cantProd)",
                'nota'  => "Promo $nomItem → producto: $nomProd (x$cantProd)",
            ];
            if ($tipoBase === 11) {
                $queries[] = [
                    'tipo'  => 'INSERT',
                    'tabla' => 'nsalida',
                    'sql'   => "INSERT INTO nsalida (transacciones_idtransacciones, productos_idprod, cant, asignar) VALUES ($idTxSim, {$pItem['id_prod']}, $cantProd, 0)",
                    'nota'  => "nsalida para tipo 11 — $nomProd",
                ];
            }
        }
    } else {
        $queries[] = [
            'tipo'  => 'INSERT',
            'tabla' => 'pedido',
            'sql'   => "INSERT INTO pedido (transacciones_idtransacciones, productos_idprod, cant) VALUES ($idTxSim, $idItem, $cantidad)",
            'nota'  => "Producto: $nomItem",
        ];
        if ($tipoBase === 11) {
            $queries[] = [
                'tipo'  => 'INSERT',
                'tabla' => 'nsalida',
                'sql'   => "INSERT INTO nsalida (transacciones_idtransacciones, productos_idprod, cant, asignar) VALUES ($idTxSim, $idItem, $cantidad, 0)",
                'nota'  => "nsalida para tipo 11 — $nomItem",
            ];
        }
    }
}

// 6. Vouchers
$vouchersUsados = $b['vouchers'] ?? [];
foreach ($vouchersUsados as $vUsado) {
    $idv    = trim($vUsado['idv'] ?? '');
    $montoV = (float)($vUsado['monto'] ?? 0);
    if ($idv === '' || $montoV <= 0) continue;

    $stmtVou = $db->prepare('SELECT idvoucher, restante FROM voucher WHERE idv = ? AND status = 0');
    $stmtVou->execute([$idv]);
    $rowV = $stmtVou->fetch(PDO::FETCH_ASSOC);
    if (!$rowV) {
        $queries[] = ['tipo' => 'ADVERTENCIA', 'tabla' => 'voucher', 'sql' => "Voucher '$idv' no encontrado o ya usado (status≠0)", 'nota' => 'No se actualizará'];
        continue;
    }
    $nuevoRestante = max(0, (float)$rowV['restante'] - $montoV);
    $nuevoStatus   = ($nuevoRestante <= 0) ? 1 : 0;
    $idvoucherPK   = $rowV['idvoucher'];
    $queries[] = [
        'tipo'  => 'UPDATE',
        'tabla' => 'voucher',
        'sql'   => "UPDATE voucher SET restante = $nuevoRestante, status = $nuevoStatus, observaciones = CONCAT(IFNULL(observaciones,''), ' TX:$idTxSim') WHERE idv = '$idv'",
        'nota'  => "Restante actual: {$rowV['restante']} → nuevo: $nuevoRestante | Status: $nuevoStatus",
    ];
    // INSERT en asignavoucher
    $queries[] = [
        'tipo'  => 'INSERT',
        'tabla' => 'asignavoucher',
        'sql'   => "INSERT INTO asignavoucher (idvoucher, idtransacciones, monto) VALUES ($idvoucherPK, $idTxSim, $montoV)",
        'nota'  => "Registro de uso del voucher $idv en la transacción",
    ];
}

// 6b. Guardar nueva dirección (si se marcó el checkbox y es dirección nueva)
if ($guardarDir && !($idDireccionEnvio > 0) && !empty($dirData['calle'])) {
    $dCalle      = addslashes(trim($dirData['calle']      ?? ''));
    $dNoExt      = addslashes(trim($dirData['noExt']      ?? ''));
    $dNoInt      = addslashes(trim($dirData['noInt']      ?? ''));
    $dEntre1     = addslashes(trim($dirData['entre1']     ?? ''));
    $dEntre2     = addslashes(trim($dirData['entre2']     ?? ''));
    $dReferencia = addslashes(trim($dirData['referencia'] ?? ''));
    $dColonia    = addslashes(trim($dirData['colonia']    ?? ''));
    $dCiudad     = addslashes(trim($dirData['ciudad']     ?? ''));
    $dEstado     = addslashes(trim($dirData['estado']     ?? ''));
    $dCp         = addslashes(trim($dirData['cp']         ?? ''));
    $queries[] = [
        'tipo'  => 'INSERT',
        'tabla' => 'direccionenvio',
        'sql'   => "INSERT INTO direccionenvio (id_inver, calle, noExt, noInt, entre1, entre2, referencia, colonia, ciudad, estado, cp, pais, status) VALUES ($idinv, '$dCalle', '$dNoExt', '$dNoInt', '$dEntre1', '$dEntre2', '$dReferencia', '$dColonia', '$dCiudad', '$dEstado', '$dCp', 'México', 1)",
        'nota'  => "Nueva dirección guardada para distribuidor $idinv — id_direccionenvio = [NUEVO_AUTO_INCREMENT]",
    ];
    // El id_direccionenvio del INSERT anterior se usará en transaccion_adicionales
    $dirIdInsertFinal = '[NUEVO_AUTO_INCREMENT]';
} else {
    $dirIdInsertFinal = ($idDireccionEnvio && $idDireccionEnvio > 0) ? $idDireccionEnvio : 'NULL';
}

// 7. transaccion_adicionales (si cdentrega = 8 o 12)
if ($cdentrega === 8 || $cdentrega === 12) {
    $confirmaDeposito = $pagoCompleto ? 1 : 0;
    $metodoPago       = $pagos[0]['metodo'] ?? 'efectivo';
    $queries[] = [
        'tipo'  => 'INSERT',
        'tabla' => 'transaccion_adicionales',
        'sql'   => "INSERT INTO transaccion_adicionales (idtransacciones, fuente, id_direccionenvio, costoEnvio, confirmaDeposito, metodoPago, telefono) VALUES ($idTxSim, '2', $dirIdInsertFinal, $costoEnvio, $confirmaDeposito, '$metodoPago', '$contactoTel')",
        'nota'  => "Envío a domicilio — tipo: $tipoEnvio",
    ];
}

// 8. Skydropx (solo si hay cotización)
if ($skydropxCotizacionId || $skydropxRateId) {
    $queries[] = [
        'tipo'  => 'UPDATE',
        'tabla' => 'transacciones',
        'sql'   => "UPDATE transacciones SET skydropx_cotizacion_id = '$skydropxCotizacionId', skydropx_rate_id = '$skydropxRateId', carrier = '$carrier' WHERE idtransacciones = $idTxSim",
        'nota'  => 'Datos de cotización Skydropx',
    ];
}

// 9. Correo
$queries[] = [
    'tipo'        => 'CORREO',
    'descripcion' => 'Envío de correo al distribuidor',
    'valores'     => [
        'Destinatario' => ($inv['email'] ?? 'Sin email registrado'),
        'Nombre'       => $nombreDist,
        'Asunto'       => $pagoCompleto ? "✅ Pedido confirmado #[AUTO] - Real Rich Business" : "📋 Pedido registrado #[AUTO] - Pago pendiente",
        'Estado pago'  => $pagoCompleto ? 'Confirmado' : 'Pendiente',
    ],
];

echo json_encode([
    'ok'      => true,
    'modo'    => 'DEBUG — ningún cambio fue guardado en la base de datos',
    'queries' => $queries,
], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
