<?php
// envios/lista_envios_api.php

session_start();
require __DIR__ . '/../includes/session_control.php';
require_once __DIR__ . '/../includes/user_activity_log.php';
require __DIR__ . '/../cotizaciones/api/_node.php';

header('Content-Type: application/json');
http_response_code(200);

$token = cpn_node_token_or_fail();
$base = cpn_node_api_base();

// Leer action
$action = $_REQUEST['action'] ?? '';

switch ($action) {

    // ============================================================
    // 1) LISTAR FACTURAS DISPONIBLES PARA CRUCE
    //    SELECT inicial:
    //      fecha, prefijoFactura, noFactura, total, nombre, apellido, razonSocial,
    //      esCredito, idOrigen, idGasto, cruzada, idTercero
    //    Solo facturas con esCredito=1 y cruzada=0
    // ============================================================
    case 'list_facturas':
        $r = cpn_node_request('GET', $base . '/api/envios/facturas', $token);
        if (!isset($r['ok']) || $r['ok'] !== true) {
            echo json_encode([]);
            exit;
        }

        echo json_encode($r['data'] ?? []);
        exit;

        // ============================================================
        // 2) LISTAR ENVIOS PARA CRUCE
        //    Parámetro esperado: idTercero
        //    Condición: tb_envios.idGasto IS NULL AND tb_proveedor_envio.idTercero = idTercero
        // ============================================================
    case 'list_envios_para_cruce':
        $idTercero = intval($_REQUEST['idTercero'] ?? 0);
        if ($idTercero <= 0) {
            echo json_encode([]);
            exit;
        }
        $url = $base . '/api/envios/para-cruce?' . http_build_query(['idTercero' => $idTercero]);
        $r = cpn_node_request('GET', $url, $token);
        if (!isset($r['ok']) || $r['ok'] !== true) {
            echo json_encode([]);
            exit;
        }

        echo json_encode($r['data'] ?? []);
        exit;

        // ============================================================
        // 3) ACTUALIZAR CAMPO DE UN ENVÍO (live edit)
        //    Parámetros: idEnvio, field, value
        //    Solo se permiten: fecha, idEmpresa, idFormaEntrega, idMedio, 
        //                     idTransportadora, guiaSeguimiento, precioEnvio, idEstadoEnvio
        // ============================================================
    case 'update_field':
        $idEnvio = intval($_POST['idEnvio'] ?? 0);
        $field   = $_POST['field']   ?? '';
        $value   = $_POST['value']   ?? '';

        $allowedFields = [
            'fecha',
            'idEmpresa',
            'idFormaEntrega',
            'idMedio',
            'idTransportadora',
            'guiaSeguimiento',
            'precioEnvio',
            'idEstadoEnvio'
        ];
        if (!in_array($field, $allowedFields, true) || $idEnvio <= 0) {
            echo json_encode(['success' => false, 'error' => 'Campo no permitido o ID inválido']);
            exit;
        }

        $r = cpn_node_request('PATCH', $base . '/api/envios/' . $idEnvio, $token, [
            'field' => $field,
            'value' => $value,
        ]);

        if (!isset($r['ok']) || $r['ok'] !== true) {
            echo json_encode(['success' => false, 'error' => $r['error']['message'] ?? 'Error actualizando en Node']);
            exit;
        }

        cpn_activity_log_event('envios', 'envios.envio_update_field', 'Actualizó campo de envío', 'envio', $idEnvio, [
            'field' => $field,
            'value' => $value,
        ]);

        echo json_encode(['success' => true]);
        exit;

        // ============================================================
        // 4) ELIMINAR UN ENVÍO
        //    Parámetro: idEnvio
        //    Solo si idGasto IS NULL (verificamos antes)
        // ============================================================
    case 'delete_envio':
        $idEnvio = intval($_POST['idEnvio'] ?? 0);
        if ($idEnvio <= 0) {
            echo json_encode(['success' => false, 'error' => 'ID inválido']);
            exit;
        }

        $r = cpn_node_request('DELETE', $base . '/api/envios/' . $idEnvio, $token);
        if (!isset($r['ok']) || $r['ok'] !== true) {
            echo json_encode(['success' => false, 'error' => $r['error']['message'] ?? 'Error eliminando en Node']);
            exit;
        }

        cpn_activity_log_event('envios', 'envios.envio_delete', 'Eliminó envío', 'envio', $idEnvio, []);

        echo json_encode(['success' => true]);
        exit;

        // ============================================================
        // 5) AGREGAR UN ENVÍO A GASTO (CALL crear_gasto_envio(?))
        //    Parámetro: idEnvio
        //    Asumimos que existe un PROCEDURE en MySQL:
        //      CREATE PROCEDURE crear_gasto_envio(IN pidEnvio INT)
        //      BEGIN
        //        -- lógica para crear gasto y actualizar tb_envios.idGasto
        //      END;
        // ============================================================
    case 'marcar_factura_cruzada':
        $idGasto = intval($_POST['idGasto'] ?? 0);
        if ($idGasto <= 0) {
            echo json_encode(['success' => false, 'error' => 'ID de factura inválido']);
            exit;
        }
        $r = cpn_node_request('POST', $base . '/api/envios/facturas/' . $idGasto . '/marcar-cruzada', $token, []);
        if (!isset($r['ok']) || $r['ok'] !== true) {
            echo json_encode(['success' => false, 'error' => $r['error']['message'] ?? 'Error marcando factura en Node']);
            exit;
        }

        cpn_activity_log_event('envios', 'envios.factura_marcar_cruzada', 'Marcó factura como cruzada', 'gasto', $idGasto, []);

        echo json_encode(['success' => true]);
        exit;

    case 'crear_gasto_envio':
        $idEnvio = intval($_POST['idEnvio'] ?? 0);
        if ($idEnvio <= 0) {
            echo json_encode(['success' => false, 'error' => 'ID inválido']);
            exit;
        }
        $r = cpn_node_request('POST', $base . '/api/envios/' . $idEnvio . '/crear-gasto', $token, []);
        if (!isset($r['ok']) || $r['ok'] !== true) {
            echo json_encode(['success' => false, 'error' => $r['error']['message'] ?? 'Error creando gasto en Node']);
            exit;
        }

        cpn_activity_log_event('envios', 'envios.envio_crear_gasto', 'Creó gasto desde envío', 'envio', $idEnvio, [
            'idGasto' => $r['data']['idGasto'] ?? null,
        ]);

        echo json_encode(['success' => true]);
        exit;

    default:
        echo json_encode(['error' => 'Acción inválida']);
        exit;
}
