<?php
/**
 * admin/api/orders-confirm.php
 * Confirma el pago de una orden pendiente:
 *  - Actualiza depositos: banco_idbanco, no_ficha
 *  - Cambia tipostr_idtipostr: 7→10 / 8→11
 *  - Genera guía Skydropx con cotizacion_id y rate_id guardados
 *  - Devuelve tracking_number y label_url
 */

header('Content-Type: application/json; charset=utf-8');
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';

// ─── Skydropx token fijo ──────────────────────────────────────────────────────
define('SKYDROPX_TOKEN', 'fu2NBDfakUSBhTIdql/dNMVY1Ylum0MI7LUqvFzPJMtDTrEHjVi0K6wdNXnOAoRbGIgWYcpZsS3e');
define('SKYDROPX_API',   'https://api-pro.skydropx.com/v1');

function skydropxPost(string $endpoint, array $payload): array {
    $ch = curl_init(SKYDROPX_API . $endpoint);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => json_encode($payload),
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . SKYDROPX_TOKEN,
        ],
        CURLOPT_TIMEOUT        => 30,
    ]);
    $body = curl_exec($ch);
    $err  = curl_error($ch);
    curl_close($ch);
    if ($err) throw new RuntimeException("cURL error: $err");
    return json_decode($body, true) ?? [];
}

// ─── Leer body JSON ───────────────────────────────────────────────────────────
$input = json_decode(file_get_contents('php://input'), true) ?? [];
$idtransacciones = (int)($input['idtransacciones'] ?? 0);
$bancoId         = $input['banco_idbanco'] ?? null;
$noFicha         = $input['no_ficha']      ?? null;

if (!$idtransacciones) {
    echo json_encode(['error' => 'idtransacciones requerido']);
    exit;
}

// ─── Conexión DB ──────────────────────────────────────────────────────────────
try {
    $pdo = new PDO(
        "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8",
        DB_USER,
        DB_PASS,
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
    );
} catch (PDOException $e) {
    echo json_encode(['error' => 'DB: ' . $e->getMessage()]);
    exit;
}

// ─── Obtener datos de la transacción ─────────────────────────────────────────
$stmt = $pdo->prepare("
    SELECT
        t.idtransacciones,
        t.tipostr_idtipostr AS tipo,
        t.skydropx_cotizacion_id,
        t.skydropx_rate_id,
        t.skydropx_order_id,
        i.nombre, i.appat, i.apmat, i.email, i.tel1,
        d.cantidad AS total,
        ta.cdentrega,
        ta.costoEnvio,
        ta.id_direccionenvio,
        ta.confirmaDeposito AS metodo_pago,
        de.calle, de.noExt, de.noInt, de.colonia, de.ciudad, de.estado, de.cp, de.referencia
    FROM transacciones t
    JOIN depositos d ON t.idtransacciones = d.transacciones_idtransacciones
    JOIN inversionista i ON t.inversionista_id_inver = i.id_inver
    LEFT JOIN transaccion_adicionales ta ON t.idtransacciones = ta.transacciones_idtransacciones
    LEFT JOIN direccionenvio de ON ta.id_direccionenvio = de.id_direccionenvio
    WHERE t.idtransacciones = ?
    LIMIT 1
");
$stmt->execute([$idtransacciones]);
$orden = $stmt->fetch();

if (!$orden) {
    echo json_encode(['error' => 'Orden no encontrada']);
    exit;
}

if (!in_array($orden['tipo'], [7, 8])) {
    echo json_encode(['error' => 'La orden ya fue confirmada o no es válida']);
    exit;
}

$nuevoTipo = ($orden['tipo'] == 7) ? 10 : 11;

// ─── Actualizar depositos (banco y folio) ─────────────────────────────────────
$sqlDep = "UPDATE depositos SET ";
$paramsDep = [];
if ($bancoId !== null) {
    $sqlDep .= "banco_idbanco = ?, ";
    $paramsDep[] = $bancoId;
}
if ($noFicha !== null) {
    $sqlDep .= "no_ficha = ?, ";
    $paramsDep[] = $noFicha;
}
$sqlDep = rtrim($sqlDep, ', ');
$sqlDep .= " WHERE transacciones_idtransacciones = ?";
$paramsDep[] = $idtransacciones;

if (count($paramsDep) > 1) {
    $pdo->prepare($sqlDep)->execute($paramsDep);
}

// ─── Cambiar tipo de transacción ──────────────────────────────────────────────
$pdo->prepare("UPDATE transacciones SET tipostr_idtipostr = ? WHERE idtransacciones = ?")
    ->execute([$nuevoTipo, $idtransacciones]);

// ─── Generar guía Skydropx (si hay cotizacion_id y rate_id guardados) ─────────
$trackingNumber = null;
$labelUrl       = null;
$skydropxError  = null;

if (!empty($orden['skydropx_cotizacion_id']) && !empty($orden['skydropx_rate_id'])) {
    try {
        // Crear shipment a partir de la cotización guardada
        $shipmentPayload = [
            'shipment' => [
                'quotation_id' => $orden['skydropx_cotizacion_id'],
                'rate_id'      => $orden['skydropx_rate_id'],
                'consignment_note_class_code' => '10101500',
                'consignment_note_packaging'  => '4G',
                'address_from' => [
                    'zip_code'  => '45160',
                    'country'   => 'MX',
                    'name'      => 'RRB Mexico',
                    'company'   => 'Real Rich Business',
                    'email'     => 'noreply@productosrrb.com',
                    'phone'     => '3318078785',
                    'street'    => 'Mexico Independiente',
                    'street2'   => '499',
                    'city'      => 'Zapopan',
                    'province'  => 'Jalisco',
                ],
                'address_to' => [
                    'zip_code'  => $orden['cp']     ?? '',
                    'country'   => 'MX',
                    'name'      => trim($orden['nombre'] . ' ' . $orden['appat'] . ' ' . $orden['apmat']),
                    'email'     => $orden['email']  ?? '',
                    'phone'     => $orden['tel1']   ?? '',
                    'street'    => $orden['calle']  ?? '',
                    'street2'   => ($orden['noExt'] ?? '') . ($orden['noInt'] ? ' Int. ' . $orden['noInt'] : ''),
                    'city'      => $orden['ciudad'] ?? '',
                    'province'  => $orden['estado'] ?? '',
                    'reference' => $orden['referencia'] ?? '',
                ],
                'parcels' => [[
                    'weight'        => 1,
                    'height'        => 20,
                    'width'         => 20,
                    'length'        => 20,
                    'distance_unit' => 'CM',
                    'mass_unit'     => 'KG',
                ]],
            ]
        ];

        $shipResp = skydropxPost('/shipments', $shipmentPayload);

        if (!empty($shipResp['shipment']['id'])) {
            $shipmentId = $shipResp['shipment']['id'];

            // Crear label
            $labelResp = skydropxPost('/labels', ['shipment_id' => $shipmentId]);

            $trackingNumber = $labelResp['label']['tracking_number']
                           ?? $shipResp['shipment']['tracking_number']
                           ?? null;
            $labelUrl       = $labelResp['label']['label_url']
                           ?? $labelResp['label']['label_pdf']
                           ?? null;

            // Guardar en DB
            $pdo->prepare("UPDATE transacciones SET skydropx_order_id = ? WHERE idtransacciones = ?")
                ->execute([$shipmentId, $idtransacciones]);
        } else {
            $skydropxError = 'No se pudo crear el envío en Skydropx: ' . json_encode($shipResp);
        }
    } catch (Exception $e) {
        $skydropxError = $e->getMessage();
    }
} elseif (!empty($orden['skydropx_order_id'])) {
    // Ya tiene order_id (orden creada previamente), solo crear label
    try {
        $labelResp = skydropxPost('/labels', ['shipment_id' => $orden['skydropx_order_id']]);
        $trackingNumber = $labelResp['label']['tracking_number'] ?? null;
        $labelUrl       = $labelResp['label']['label_url'] ?? $labelResp['label']['label_pdf'] ?? null;
    } catch (Exception $e) {
        $skydropxError = $e->getMessage();
    }
}

// ─── Respuesta ────────────────────────────────────────────────────────────────
$response = [
    'success'         => true,
    'nuevo_tipo'      => $nuevoTipo,
    'tracking_number' => $trackingNumber,
    'label_url'       => $labelUrl,
];
if ($skydropxError) {
    $response['skydropx_warning'] = $skydropxError;
}

echo json_encode($response);
