<?php
/**
 * compra-guardar.php
 * POST → Guarda una nueva compra (transacción tipo 10/11/7/8)
 *        Adaptado de purchases/new.php:
 *        - cdId viene del payload (centro seleccionado), no hardcodeado a 50
 *        - Auth via admin_sessions en lugar de JWT de inversionista
 *        - idinv viene del payload (distribuidor buscado)
 */
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);   // centro generador (seleccionado)
$idinv     = (int)($b['id_inv']    ?? 0);   // distribuidor
$tipoBase  = (int)($b['tipo_nota'] ?? 10);  // 10=venta, 11=por asignar
$items     = $b['items']  ?? [];
$pagos     = $b['pagos']  ?? [];
$cdentrega = (int)($b['cdentrega'] ?? 8);

// Envío a domicilio — datos del Paso 4.5
$envioData            = $b['envio'] ?? [];                                          // objeto completo de envío
$costoEnvio           = (int)round((float)($envioData['costo_envio'] ?? $b['costo_envio'] ?? 0));
$tipoEnvio            = $envioData['tipo'] ?? 'gratis';                             // 'skydropx' | 'manual' | '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;                       // {calle,noExt,noInt,colonia,ciudad,estado,cp}
$idDireccionEnvio     = isset($b['id_direccion_envio']) ? (int)$b['id_direccion_envio'] : null;  // por compatibilidad

// Validaciones básicas
if ($cdId <= 0)     { http_response_code(400); echo json_encode(['ok'=>false,'error'=>'Centro generador requerido']); exit; }
if ($idinv <= 0)    { http_response_code(400); echo json_encode(['ok'=>false,'error'=>'Distribuidor requerido']); exit; }
if (!in_array($tipoBase, [10, 11])) { http_response_code(400); echo json_encode(['ok'=>false,'error'=>'Tipo de nota inválido']); exit; }
if (empty($items))  { http_response_code(400); echo json_encode(['ok'=>false,'error'=>'Debe incluir al menos un producto']); exit; }
if (empty($pagos))  { http_response_code(400); echo json_encode(['ok'=>false,'error'=>'Debe incluir al menos un pago']); exit; }

// ── 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 se desglosó, asignar todo al primer método
if (($ef + $dep + $tar + $vou) == 0 && $totalVenta > 0) {
    $metDefault = $pagos[0]['metodo'] ?? 'efectivo';
    if ($metDefault === 'efectivo')          $ef  = $totalVenta;
    elseif ($metDefault === 'deposito')      $dep = $totalVenta;
    elseif ($metDefault === 'transferencia') $dep = $totalVenta;
    elseif ($metDefault === 'tarjeta')       $tar = $totalVenta;
    elseif ($metDefault === 'voucher')       $vou = $totalVenta;
    else                                     $ef  = $totalVenta;
}

// ── Determinar si el pago está confirmado ────────────────────────────────────
$tieneVoucher  = $vou  > 0;
$tieneDeposito = $dep  > 0;
$tieneTarjeta  = $tar  > 0;
$tieneEfectivo = $ef   > 0;

$esMixtoVoucherDeposito = $tieneVoucher && $tieneDeposito && !$tieneTarjeta && !$tieneEfectivo;
$pagoConfirmado = ($tieneTarjeta || $tieneEfectivo || ($tieneVoucher && !$esMixtoVoucherDeposito));

// ── Tipo real de nota ─────────────────────────────────────────────────────────
if ($tipoBase === 10) {
    $tipo = $pagoConfirmado ? 10 : 7;
} else {
    $tipo = $pagoConfirmado ? 11 : 8;
}

// ── Montos para pagovta ───────────────────────────────────────────────────────
if ($esMixtoVoucherDeposito) {
    $efPago = 0; $depPago = 0; $tarPago = 0; $vouPago = $vou;
    $porpagar = max(0, $totalVenta - $vou);
} elseif (!$pagoConfirmado) {
    $efPago = 0; $depPago = 0; $tarPago = 0; $vouPago = 0;
    $porpagar = $totalVenta;
} else {
    $efPago = $ef; $depPago = $dep; $tarPago = $tar; $vouPago = $vou;
    $porpagar = max(0, $totalVenta - ($ef + $dep + $tar + $vou));
}

// ── Guardar en base de datos ──────────────────────────────────────────────────
$db->beginTransaction();
try {
    $fecha = date('Y-m-d');
    $hora  = date('H:i:s');

    // Consecutivo del centro generador
    $stmtC = $db->prepare('SELECT consec FROM cdconsec WHERE idcd = ? FOR UPDATE');
    $stmtC->execute([$cdId]);
    $consec = (int)($stmtC->fetchColumn() ?: 0) + 1;
    $db->prepare('INSERT INTO cdconsec (idcd, consec) VALUES (?,?) ON DUPLICATE KEY UPDATE consec=?')
       ->execute([$cdId, $consec, $consec]);

    // 1. transacciones
    $stmtTx = $db->prepare(
        "INSERT INTO transacciones
         (inversionista_id_inver, tipostr_idtipostr, fechat, horat,
          usuarios_ci_idusuarios_ci, consec, cdentrega, statusentrega)
         VALUES (?,?,?,?,?,?,?,'PENDIENTE')"
    );
    $stmtTx->execute([$idinv, $tipo, $fecha, $hora, $cdId, $consec, $cdentrega]);
    $idTx = (int)$db->lastInsertId();

    // 2. depositos
    $puntosDeposito = ($tipoBase === 10) ? $totalPuntos : 0;
    $db->prepare(
        'INSERT INTO depositos (centros_idcd, transacciones_idtransacciones, cantidad, puntos)
         VALUES (?,?,?,?)'
    )->execute([$cdId, $idTx, $totalVenta, $puntosDeposito]);

    // 3. pagovta
    $db->prepare(
        'INSERT INTO pagovta (idtransacciones, efectivo, deposito, tarjeta, voucher, porpagar, abono)
         VALUES (?,?,?,?,?,?,0)'
    )->execute([$idTx, $efPago, $depPago, $tarPago, $vouPago, $porpagar]);

    // 4. depositos_transaccion — tarjeta y depósitos con datos bancarios
    if ($tar > 0) {
        $folioMP = $b['folio_mp'] ?? ('MP' . time());
        $db->prepare(
            'INSERT INTO depositos_transaccion
             (idtransacciones, tipo, monto, folio, idbanco, fecha)
             VALUES (?,2,?,?,42,?)'
        )->execute([$idTx, $tar, $folioMP, $fecha . ' ' . $hora]);
    }

    // Depósitos bancarios con banco, folio y fecha capturados en el modal
    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']       ?? ''); // YYYY-MM-DD
        if ($montoDep <= 0 || !$idbancoD || $folioD === '') continue;
        $fechaDepDT = $fechaDepR ? ($fechaDepR . ' 00:00:00') : ($fecha . ' ' . $hora);
        $db->prepare(
            'INSERT INTO depositos_transaccion
             (idtransacciones, tipo, monto, folio, idbanco, fecha)
             VALUES (?,2,?,?,?,?)'
        )->execute([$idTx, $montoDep, $folioD, $idbancoD, $fechaDepDT]);
    }

    // 5. pedido_real y pedido (expandiendo promos)
    foreach ($items as $item) {
        $tipoItem = $item['tipo'] ?? 'producto';
        $cantidad = (int)($item['cantidad'] ?? 1);
        $esPaq    = ($tipoItem === 'paquete' || $tipoItem === 'promo');
        $idItem   = (int)($item['id_prod'] ?? 0);

        $db->prepare('INSERT INTO pedido_real (transacciones, id_prod, cant) VALUES (?,?,?)')
           ->execute([$idTx, $idItem, $cantidad]);

        if ($esPaq) {
            $stmtPP = $db->prepare(
                'SELECT pp.idprodp AS id_prod, pp.cantp AS cq FROM promop pp WHERE pp.promop = ?'
            );
            $stmtPP->execute([$idItem]);
            foreach ($stmtPP->fetchAll() as $pItem) {
                $db->prepare(
                    'INSERT INTO pedido (transacciones_idtransacciones, productos_idprod, cant) VALUES (?,?,?)'
                )->execute([$idTx, $pItem['id_prod'], (int)$pItem['cq'] * $cantidad]);
            }
        } else {
            $db->prepare(
                'INSERT INTO pedido (transacciones_idtransacciones, productos_idprod, cant) VALUES (?,?,?)'
            )->execute([$idTx, $idItem, $cantidad]);
        }

        // nsalida solo si tipo_base = 11
        if ($tipoBase === 11) {
            $db->prepare(
                'INSERT INTO nsalida (transacciones_idtransacciones, productos_idprod, cant, asignar)
                 VALUES (?,?,?,0)'
            )->execute([$idTx, $idItem, $cantidad]);
        }
    }

    // 6. Vouchers: actualizar restante y status
    $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 restante FROM voucher WHERE idv = ? AND status = 0 FOR UPDATE');
        $stmtVou->execute([$idv]);
        $rowV = $stmtVou->fetch(PDO::FETCH_ASSOC);
        if (!$rowV) continue;

        $nuevoRestante = max(0, (float)$rowV['restante'] - $montoV);
        $nuevoStatus   = ($nuevoRestante <= 0) ? 1 : 0;
        $db->prepare(
            'UPDATE voucher SET restante = ?, status = ?,
             observaciones = CONCAT(IFNULL(observaciones,""), " TX:", ?)
             WHERE idv = ?'
        )->execute([$nuevoRestante, $nuevoStatus, $idTx, $idv]);
    }

    // 7. transaccion_adicionales — si es envío a domicilio (cdentrega = 8)
    if ($cdentrega === 8) {
        $confirmaDeposito = $pagoConfirmado ? 1 : 0;
        $metodoPago       = $pagos[0]['metodo'] ?? 'efectivo';
        // Usar id_direccionenvio si viene, sino NULL (dirección en texto libre)
        $dirIdInsert = $idDireccionEnvio ?: null;
        $db->prepare(
            'INSERT INTO transaccion_adicionales
             (idtransacciones, fuente, id_direccionenvio, costoEnvio, confirmaDeposito, metodoPago, telefono)
             VALUES (?,?,?,?,?,?,?)'
        )->execute([$idTx, '2', $dirIdInsert, $costoEnvio, $confirmaDeposito, $metodoPago, $contactoTel]);
    }

    // 8. Guardar datos de Skydropx en transacciones (cotización y rate seleccionados)
    if ($skydropxCotizacionId || $skydropxRateId) {
        $db->prepare(
            'UPDATE transacciones SET
               skydropx_cotizacion_id = ?,
               skydropx_rate_id       = ?,
               carrier                = ?
             WHERE idtransacciones = ?'
        )->execute([$skydropxCotizacionId, $skydropxRateId, $carrier, $idTx]);
    }

    $db->commit();

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

    if ($emailDest) {
        // Construir resumen de productos
        $resumenProds = '';
        foreach ($items as $item) {
            $cant   = (int)($item['cantidad'] ?? 1);
            $nombre = htmlspecialchars($item['nombre'] ?? 'Producto');
            $precio = number_format((float)($item['precio'] ?? 0), 2);
            $resumenProds .= "<tr>
                <td style='padding:6px 12px;border-bottom:1px solid #f3f4f6'>{$nombre}</td>
                <td style='padding:6px 12px;border-bottom:1px solid #f3f4f6;text-align:center'>{$cant}</td>
                <td style='padding:6px 12px;border-bottom:1px solid #f3f4f6;text-align:right'>\${$precio}</td>
            </tr>";
        }

        $totalFmt   = number_format($totalVenta, 2);
        $estadoPago = $pagoConfirmado ? '✅ Pago confirmado' : '⏳ Pago pendiente';
        $asunto     = $pagoConfirmado
            ? '✅ Pedido confirmado #' . $idTx . ' - Real Rich Business'
            : '📋 Pedido registrado #' . $idTx . ' - Pago pendiente';

        $html = '<!DOCTYPE html><html><body style="font-family:Arial,sans-serif;background:#f9fafb;margin:0;padding:0">
<table width="100%" cellpadding="0" cellspacing="0"><tr><td align="center" style="padding:32px 16px">
<table width="600" cellpadding="0" cellspacing="0" style="background:#fff;border-radius:12px;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,.08)">
  <tr><td style="background:#0a7ea4;padding:28px 32px">
    <h1 style="margin:0;color:#fff;font-size:22px">Real Rich Business</h1>
    <p style="margin:6px 0 0;color:#e0f2fe;font-size:14px">' . $estadoPago . '</p>
  </td></tr>
  <tr><td style="padding:24px 32px">
    <p style="margin:0 0 16px;font-size:15px;color:#374151">Hola <b>' . htmlspecialchars($nombreDist) . '</b>,</p>
    <p style="margin:0 0 20px;font-size:14px;color:#6b7280">Tu pedido <b>#' . $idTx . '</b> ha sido registrado.</p>
    <table width="100%" cellpadding="0" cellspacing="0" style="border:1px solid #e5e7eb;border-radius:8px;overflow:hidden;margin-bottom:20px">
      <tr style="background:#f9fafb">
        <th style="padding:8px 12px;text-align:left;font-size:13px;color:#6b7280">Producto</th>
        <th style="padding:8px 12px;text-align:center;font-size:13px;color:#6b7280">Cant.</th>
        <th style="padding:8px 12px;text-align:right;font-size:13px;color:#6b7280">Precio</th>
      </tr>
      ' . $resumenProds . '
      <tr>
        <td colspan="2" style="padding:10px 12px;font-weight:700;font-size:14px">Total</td>
        <td style="padding:10px 12px;font-weight:700;font-size:14px;text-align:right">$' . $totalFmt . '</td>
      </tr>
    </table>
  </td></tr>
  <tr><td style="padding:20px 32px 28px;background:#f9fafb;border-top:1px solid #e5e7eb">
    <p style="margin:0;font-size:12px;color:#9ca3af;text-align:center">
      ¿Tienes dudas? Contáctanos en <a href="mailto:contacto@rrbmexico.com" style="color:#0a7ea4">contacto@rrbmexico.com</a>
    </p>
    <p style="margin:6px 0 0;font-size:11px;color:#d1d5db;text-align:center">
      © ' . date('Y') . ' Real Rich Business · Correo generado automáticamente.
    </p>
  </td></tr>
</table></td></tr></table>
</body></html>';

        $brevoApiKey  = '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';
        $brevoPayload = json_encode([
            'sender'      => ['name' => 'Real Rich Business', 'email' => 'noreply@productosrrb.com'],
            'to'          => [['email' => $emailDest, 'name' => $nombreDist]],
            'replyTo'     => ['email' => 'contacto@rrbmexico.com'],
            'subject'     => $asunto,
            'htmlContent' => $html,
        ]);

        $ch = curl_init('https://api.brevo.com/v3/smtp/email');
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => $brevoPayload,
            CURLOPT_HTTPHEADER     => [
                'accept: application/json',
                'api-key: ' . $brevoApiKey,
                'content-type: application/json',
            ],
            CURLOPT_TIMEOUT => 10,
        ]);
        curl_exec($ch);
        curl_close($ch);
    }

    // ── Respuesta ─────────────────────────────────────────────────────────────
    echo json_encode([
        'ok'              => true,
        'idtransacciones' => $idTx,
        'consec'          => $consec,
        'tipo'            => $tipo,
        'tipo_base'       => $tipoBase,
        'total'           => $totalVenta,
        'puntos'          => $puntosDeposito,
        'estado_pago'     => $pagoConfirmado ? 'aprobado' : 'pendiente',
        'mensaje'         => $tipoBase === 10
            ? ($pagoConfirmado ? 'Nota de venta generada.' : 'Nota de venta registrada. Pago pendiente.')
            : ($pagoConfirmado ? 'Nota de salida generada.' : 'Nota de salida registrada. Pago pendiente.'),
    ], JSON_UNESCAPED_UNICODE);

} catch (Exception $e) {
    $db->rollBack();
    http_response_code(500);
    echo json_encode(['ok' => false, 'error' => 'Error al guardar: ' . $e->getMessage()]);
}
