<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

require_once __DIR__ . '/../../config.php';

// ── Verificar token admin ─────────────────────────────────────────────────────
$headers    = getallheaders();
$authHeader = $headers['Authorization'] ?? $headers['authorization'] ?? '';
$token      = str_replace('Bearer ', '', $authHeader);

if (empty($token)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Token requerido']);
    exit;
}

$db  = getDB();
$now = date('Y-m-d H:i:s');

$stmtSess = $db->prepare(
    "SELECT s.idusuarios_sist FROM admin_sessions s
     WHERE s.token = ? AND s.expira > ? LIMIT 1"
);
$stmtSess->execute([$token, $now]);
if (!$stmtSess->fetch()) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Sesión expirada o inválida']);
    exit;
}

// ── Parámetros ────────────────────────────────────────────────────────────────
$body           = json_decode(file_get_contents('php://input'), true);
$idTx           = (int)($body['idtransacciones'] ?? 0);
$skydropxRateId = $body['rate_id']        ?? null;  // tarifa seleccionada para generar guía
$carrier        = $body['carrier']        ?? null;
$contactoTel    = $body['contacto_tel']   ?? null;
$contactoEmail  = $body['contacto_email'] ?? null;
$bancoId        = $body['banco_idbanco']  ?? null;  // banco donde se depositó
$noFicha        = $body['no_ficha']       ?? null;  // folio / número de ficha
$generarGuia    = (int)($body['generar_guia'] ?? 1); // 1=generar guía, 0=solo confirmar pago
$envioEdit      = $body['envio'] ?? null;  // datos de envío editados por el admin
$pesoEnvio      = isset($envioEdit['peso']) && $envioEdit['peso'] > 0 ? (float)$envioEdit['peso'] : 3.0;

if ($idTx <= 0) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'idtransacciones requerido']);
    exit;
}

// ── Obtener la transacción ────────────────────────────────────────────────────
$stmtTx = $db->prepare("
    SELECT t.tipostr_idtipostr AS tipo, t.inversionista_id_inver AS id_inver,
           i.nombre, i.appat, i.apmat, i.email, i.tel1,
           d.cantidad AS total, d.puntos AS puntos_dep
    FROM transacciones t
    JOIN inversionista i ON i.id_inver = t.inversionista_id_inver
    JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
    WHERE t.idtransacciones = ? LIMIT 1
");
$stmtTx->execute([$idTx]);
$tx = $stmtTx->fetch(PDO::FETCH_ASSOC);

if (!$tx) {
    http_response_code(404);
    echo json_encode(['success' => false, 'message' => 'Transacción no encontrada']);
    exit;
}

$tipoActual = (int)$tx['tipo'];
if (!in_array($tipoActual, [7, 8])) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'La transacción no está pendiente de pago (tipo ' . $tipoActual . ')']);
    exit;
}

// tipo 7 → 10 (venta confirmada), tipo 8 → 11 (salida confirmada)
$tipoNuevo = ($tipoActual === 7) ? 10 : 11;

// ── Obtener datos de envío ────────────────────────────────────────────────
// Columnas reales de transaccion_adicionales: id, idtransacciones, fuente, id_direccionenvio,
// metodoPago, costoEnvio, puntosPendientes, confirmaDeposito, telefono, noCobrarFlete, num_grupo, descuento
// skydropx_rate_id, tracking_number, label_url, carrier están en la tabla transacciones
$stmtAd = $db->prepare("
    SELECT ta.id_direccionenvio, ta.costoEnvio,
           t2.skydropx_rate_id,
           de.calle, de.noExt, de.noInt, de.colonia, de.ciudad,
           de.estado, de.cp, de.referencia, de.pais
    FROM transaccion_adicionales ta
    JOIN transacciones t2 ON t2.idtransacciones = ta.idtransacciones
    LEFT JOIN direccionenvio de ON de.id = ta.id_direccionenvio
    WHERE ta.idtransacciones = ? LIMIT 1
");
$stmtAd->execute([$idTx]);
$adicional = $stmtAd->fetch(PDO::FETCH_ASSOC);

$db->beginTransaction();
try {
    // 1. Cambiar tipo de nota
    $db->prepare("UPDATE transacciones SET tipostr_idtipostr = ? WHERE idtransacciones = ?")
       ->execute([$tipoNuevo, $idTx]);

    // 2. Actualizar depositos: puntos + banco y folio si se proporcionaron
    $puntosNuevos = (int)$tx['puntos_dep'];
    $setClauses = ['puntos = ?'];
    $setParams  = [$puntosNuevos];
    if ($bancoId !== null) {
        $setClauses[] = 'banco_idbanco = ?';
        $setParams[]  = (int)$bancoId;
    }
    if ($noFicha !== null && $noFicha !== '') {
        $setClauses[] = 'no_ficha = ?';
        $setParams[]  = $noFicha;
    }
    $setParams[] = $idTx;
    $db->prepare('UPDATE depositos SET ' . implode(', ', $setClauses) . ' WHERE transacciones_idtransacciones = ?')
       ->execute($setParams);

    // 3. Actualizar pagovta: porpagar=0, abono=total (pago confirmado)
    $totalTx = (float)$tx['total'];
    $db->prepare("UPDATE pagovta SET deposito = ?, porpagar = 0, abono = ? WHERE idtransacciones = ?")
       ->execute([$totalTx, $totalTx, $idTx]);

    // 4. Actualizar transaccion_adicionales: confirmaDeposito=1
    if ($adicional) {
        $db->prepare("UPDATE transaccion_adicionales SET confirmaDeposito = 1 WHERE idtransacciones = ?")
           ->execute([$idTx]);
    }

    $db->commit();
} catch (Exception $e) {
    $db->rollBack();
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Error al confirmar: ' . $e->getMessage()]);
    exit;
}

// ── Generar guía en Skydropx (si tiene envío a domicilio) ────────────────────
$trackingNumber = null;
$labelUrl       = null;
$carrierResult  = null;
$skydropxError  = null;

if ($generarGuia && $adicional && $adicional['id_direccionenvio']) {
    $SKYDROPX_TOKEN = 'fu2NBDfakUSBhTIdql/dNMVY1Ylum0MIASA5TG5m91sk6Ex6EpmhZ+/bFe2qOf/48abQugYx671efJg2Ts4lRZFxhtGjtxuvMwkR/27V/jqH9EtjoFB9qA7ZRBG9U8FEF+K3mJ5B4lyYJ2eg+HPLIcKYus97I9WkjcYwV7qqIY0ZzzqvLavfP5ye47GyJoy4idYPBRmHGyFYywsHNlsvzpgicbFqDo5Eow8pTV5QYWVuhvL04D8BLdCwLYnlJjKb8+00fWWCnhm6GwrPDJKl9VqQDtNmGn6paRgrf+yGX5+doTP3KshIgFP5rCzIS2jjGShkA8RYja/JS4wvmS8TLx/y3Rf9SYIyXYRg78kd7rErTWbnTVlJgQdVIqxBZuO+0APRt8MmUwInYmjVcVwOJL6uSsJYNxvIg8+44wnrgRyeRnVPUf6wq0YLFMyLLX/3ZeejNLI1q4iqMb4=--CVt5WE9F7QdI51kW--FBGNOotYOF7PTQF0lVz2RQ==';

    $tel  = ($envioEdit['tel'] ?? null) ?: ($contactoTel ?? $tx['tel1'] ?? '');
    $mail = $contactoEmail ?? $tx['email'] ?? '';
    $nombre = trim($tx['nombre'] . ' ' . $tx['appat'] . ' ' . $tx['apmat']);

    // Usar datos de envio editados por el admin si se proporcionaron, si no los de la BD
    $dirCalle     = ($envioEdit['calle']      ?? null) ?: ($adicional['calle']     ?? '');
    $dirNoExt     = ($envioEdit['noExt']      ?? null) ?: ($adicional['noExt']     ?? '');
    $dirNoInt     = ($envioEdit['noInt']      ?? null) ?: ($adicional['noInt']     ?? '');
    $dirColonia   = ($envioEdit['colonia']    ?? null) ?: ($adicional['colonia']   ?? '');
    $dirCiudad    = ($envioEdit['ciudad']     ?? null) ?: ($adicional['ciudad']    ?? '');
    $dirEstado    = ($envioEdit['estado']     ?? null) ?: ($adicional['estado']    ?? '');
    $dirCp        = ($envioEdit['cp']         ?? null) ?: ($adicional['cp']        ?? '');
    $dirRef       = ($envioEdit['referencia'] ?? null) ?: ($adicional['referencia'] ?? '');

    // Usar rate_id del body o el guardado en transaccion_adicionales
    $rateId = $skydropxRateId ?? $adicional['skydropx_rate_id'] ?? null;

    if ($rateId) {
        $shipPayload = [
            'address_from' => [
                'area_level1'      => 'Jalisco',
                'area_level2'      => 'Zapopan',
                'area_level3'      => 'Plaza Patria',
                'name'             => 'Enrique Zaragoza',
                'postal_code'      => '45160',
                'country_code'     => 'MX',
                'street1'          => 'Mexico Independiente 499',
                'company'          => 'RRB Mexico',
                'phone'            => '3336244770',
                'email'            => 'contacto@rrbmexico.com',
                'reference'        => 'En esquina',
                'address_type'     => 'from',
                'apartment_number' => '',
            ],
            'address_to' => [
                'area_level1'      => $dirEstado,
                'area_level2'      => $dirCiudad,
                'area_level3'      => $dirColonia,
                'name'             => $nombre,
                'postal_code'      => $dirCp,
                'country_code'     => 'MX',
                'street1'          => trim($dirCalle . ' ' . $dirNoExt),
                'company'          => '',
                'phone'            => $tel,
                'email'            => $mail,
                'reference'        => $dirRef,
                'address_type'     => 'to',
                'apartment_number' => $dirNoInt,
            ],
            'parcels' => [[
                'length'           => 30,
                'width'            => 20,
                'height'           => 15,
                'weight'           => $pesoEnvio,
                'mass_unit'        => 'kg',
                'distance_unit'    => 'cm',
                'consignment_note' => '10101500',
                'package_type'     => '4G',
            ]],
            'rate_id'       => $rateId,
            'extra'         => ['reference' => 'RRB-' . $idTx],
        ];

        $ch = curl_init('https://pro.skydropx.com/api/v1/shipments');
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => json_encode($shipPayload),
            CURLOPT_HTTPHEADER     => [
                'Content-Type: application/json',
                'Authorization: Bearer ' . $SKYDROPX_TOKEN,
            ],
            CURLOPT_TIMEOUT        => 30,
        ]);
        $shipResp = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($httpCode === 200 || $httpCode === 201 || $httpCode === 202) {
            $shipData = json_decode($shipResp, true);
            $attrs    = $shipData['data']['attributes'] ?? [];
            $included = $shipData['included'] ?? [];

            $trackingNumber = $attrs['tracking_number'] ?? null;
            $labelUrl       = $attrs['label_url']       ?? null;
            $carrierResult  = $carrier ?? ($attrs['carrier'] ?? null);

            // Buscar en included si no viene en attributes
            foreach ($included as $inc) {
                if (($inc['type'] ?? '') === 'package') {
                    $trackingNumber = $trackingNumber ?? ($inc['attributes']['tracking_number'] ?? null);
                    $labelUrl       = $labelUrl       ?? ($inc['attributes']['label_url']       ?? null);
                }
            }

            // Guardar tracking en transacciones (donde realmente están esas columnas)
            if ($trackingNumber) {
                $db->prepare(
                    "UPDATE transacciones
                     SET tracking_number = ?, label_url = ?, carrier = ?
                     WHERE idtransacciones = ?"
                )->execute([$trackingNumber, $labelUrl, $carrierResult, $idTx]);
            }
        } else {
            $skydropxError = 'HTTP ' . $httpCode . ': ' . substr($shipResp, 0, 300);
        }
    }
}

echo json_encode([
    'success'        => true,
    'message'        => 'Pago confirmado. Nota cambiada a tipo ' . $tipoNuevo,
    'tipo_nuevo'     => $tipoNuevo,
    'tracking'       => $trackingNumber,
    'label_url'      => $labelUrl,
    'carrier'        => $carrierResult,
    'skydropx_error' => $skydropxError,
]);
