<?php
header('Content-Type: application/json');

if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

require_once __DIR__ . '/../../includes/session_control.php';
require_once __DIR__ . '/../../cotizaciones/api/_node.php';
require_once __DIR__ . '/../../includes/user_activity_log.php';

$action = (string)($_REQUEST['action'] ?? '');

$token = cpn_node_token_or_fail();
$base = cpn_node_api_base();

function bad($msg)
{
    echo json_encode(['ok' => false, 'error' => ['message' => $msg]]);
    exit;
}

function bad_node($defaultMsg, $nodeResp)
{
    $msg = $defaultMsg;
    if (is_array($nodeResp) && isset($nodeResp['error']['message']) && is_string($nodeResp['error']['message'])) {
        $msg = $nodeResp['error']['message'];
    }
    $err = ['message' => $msg];
    if (is_array($nodeResp)) {
        if (isset($nodeResp['_http'])) $err['http'] = $nodeResp['_http'];
        if (isset($nodeResp['error']['raw'])) $err['raw'] = $nodeResp['error']['raw'];
        if (isset($nodeResp['error'])) $err['nodeError'] = $nodeResp['error'];
    }
    echo json_encode(['ok' => false, 'error' => $err]);
    exit;
}

if ($action === 'meta') {
    $r = cpn_node_request('GET', $base . '/api/integrations/cambios-proveedor/meta', $token, null);
    if (empty($r['ok'])) {
        bad_node('Error consultando meta de cambios', $r);
    }
    echo json_encode(['ok' => true, 'data' => $r['data'] ?? []]);
    exit;
}

if ($action === 'list') {
    $page = max(1, (int)($_GET['page'] ?? 1));
    $limit = max(1, min(1000, (int)($_GET['limit'] ?? 100)));

    $idProveedor = trim((string)($_GET['idProveedor'] ?? ''));
    $campo = trim((string)($_GET['campo'] ?? ''));
    $resuelto = (string)($_GET['resuelto'] ?? '0');

    $qs = [
        'page' => $page,
        'limit' => $limit,
    ];
    if ($idProveedor !== '') $qs['idProveedor'] = $idProveedor;
    if ($campo !== '') $qs['campo'] = $campo;
    if ($resuelto !== '') $qs['resuelto'] = $resuelto;

    $url = $base . '/api/integrations/cambios-proveedor/alertas?' . http_build_query($qs);
    $r = cpn_node_request('GET', $url, $token, null);
    if (empty($r['ok'])) {
        bad_node('Error consultando alertas', $r);
    }

    echo json_encode(['ok' => true, 'data' => $r['data'] ?? []]);
    exit;
}

if ($action === 'apply') {
    $id = (int)($_POST['id'] ?? 0);
    if ($id <= 0) bad('id inválido');

    $url = $base . '/api/integrations/cambios-proveedor/alertas/' . urlencode((string)$id) . '/aplicar';
    $r = cpn_node_request('POST', $url, $token, []);
    if (empty($r['ok'])) {
        bad_node('Error aplicando cambio', $r);
    }

    cpn_activity_log_event(
        'Productos',
        'productos.cambios_proveedor.apply',
        'Aplicó cambio de proveedor (alerta #' . $id . ')',
        'alerta_cambio_proveedor',
        $id,
        ['id' => $id]
    );

    echo json_encode(['ok' => true, 'data' => $r['data'] ?? null]);
    exit;
}

if ($action === 'reject') {
    $id = (int)($_POST['id'] ?? 0);
    if ($id <= 0) bad('id inválido');

    $url = $base . '/api/integrations/cambios-proveedor/alertas/' . urlencode((string)$id) . '/rechazar';
    $r = cpn_node_request('POST', $url, $token, []);
    if (empty($r['ok'])) {
        bad_node('Error rechazando cambio', $r);
    }

    cpn_activity_log_event(
        'Productos',
        'productos.cambios_proveedor.reject',
        'Rechazó cambio de proveedor (alerta #' . $id . ')',
        'alerta_cambio_proveedor',
        $id,
        ['id' => $id]
    );

    echo json_encode(['ok' => true, 'data' => $r['data'] ?? null]);
    exit;
}

function parse_ids_from_request($raw)
{
    if (is_array($raw)) {
        $ids = $raw;
    } else {
        $s = trim((string)$raw);
        if ($s === '') return [];
        $ids = preg_split('/\s*,\s*/', $s);
    }

    $out = [];
    $seen = [];
    foreach ($ids as $v) {
        $n = (int)$v;
        if ($n <= 0) continue;
        if (isset($seen[$n])) continue;
        $seen[$n] = true;
        $out[] = $n;
    }
    return $out;
}

if ($action === 'apply_selected') {
    $ids = parse_ids_from_request($_POST['ids'] ?? []);
    if (empty($ids)) bad('ids requerido');

    $url = $base . '/api/integrations/cambios-proveedor/alertas/seleccion/aplicar';
    $r = cpn_node_request('POST', $url, $token, ['ids' => $ids]);
    if (empty($r['ok'])) {
        bad_node('Error aplicando cambios seleccionados', $r);
    }

    cpn_activity_log_event(
        'Productos',
        'productos.cambios_proveedor.apply_selected',
        'Aplicó cambios seleccionados (n=' . count($ids) . ')',
        'alerta_cambio_proveedor',
        null,
        ['ids' => $ids]
    );

    echo json_encode(['ok' => true, 'data' => $r['data'] ?? null]);
    exit;
}

if ($action === 'reject_selected') {
    $ids = parse_ids_from_request($_POST['ids'] ?? []);
    if (empty($ids)) bad('ids requerido');

    $url = $base . '/api/integrations/cambios-proveedor/alertas/seleccion/rechazar';
    $r = cpn_node_request('POST', $url, $token, ['ids' => $ids]);
    if (empty($r['ok'])) {
        bad_node('Error rechazando cambios seleccionados', $r);
    }

    cpn_activity_log_event(
        'Productos',
        'productos.cambios_proveedor.reject_selected',
        'Rechazó cambios seleccionados (n=' . count($ids) . ')',
        'alerta_cambio_proveedor',
        null,
        ['ids' => $ids]
    );

    echo json_encode(['ok' => true, 'data' => $r['data'] ?? null]);
    exit;
}

if ($action === 'bulk_apply') {
    $idProveedor = trim((string)($_POST['idProveedor'] ?? ''));
    $campo = trim((string)($_POST['campo'] ?? ''));
    $resuelto = (string)($_POST['resuelto'] ?? '0');

    if ($campo === '') bad('campo requerido para aprobar todas');

    $payload = [
        'campo' => $campo,
        'resuelto' => $resuelto === '' ? 0 : $resuelto,
    ];
    if ($idProveedor !== '') $payload['idProveedor'] = (int)$idProveedor;

    $url = $base . '/api/integrations/cambios-proveedor/alertas/bulk/aplicar';
    $r = cpn_node_request('POST', $url, $token, $payload);
    if (empty($r['ok'])) {
        bad_node('Error aprobando todas', $r);
    }

    cpn_activity_log_event(
        'Productos',
        'productos.cambios_proveedor.bulk_apply',
        'Aprobó cambios en lote (campo: ' . $campo . ')' . ($idProveedor !== '' ? ' proveedor #' . $idProveedor : ''),
        'alerta_cambio_proveedor',
        null,
        $payload
    );

    echo json_encode(['ok' => true, 'data' => $r['data'] ?? null]);
    exit;
}

if ($action === 'bulk_reject') {
    $idProveedor = trim((string)($_POST['idProveedor'] ?? ''));
    $campo = trim((string)($_POST['campo'] ?? ''));
    $resuelto = (string)($_POST['resuelto'] ?? '0');

    $payload = [
        'resuelto' => $resuelto === '' ? 0 : $resuelto,
    ];
    if ($idProveedor !== '') $payload['idProveedor'] = (int)$idProveedor;
    if ($campo !== '') $payload['campo'] = $campo;

    $url = $base . '/api/integrations/cambios-proveedor/alertas/bulk/rechazar';
    $r = cpn_node_request('POST', $url, $token, $payload);
    if (empty($r['ok'])) {
        bad_node('Error rechazando todas', $r);
    }

    cpn_activity_log_event(
        'Productos',
        'productos.cambios_proveedor.bulk_reject',
        'Rechazó cambios en lote' . ($campo !== '' ? ' (campo: ' . $campo . ')' : '') . ($idProveedor !== '' ? ' proveedor #' . $idProveedor : ''),
        'alerta_cambio_proveedor',
        null,
        $payload
    );

    echo json_encode(['ok' => true, 'data' => $r['data'] ?? null]);
    exit;
}

bad('Acción no soportada');
