<?php

/********************************************************************
 *  procesar_pago.php   ·  Sistema Compranet
 *  Inserta un pago y sus ítems con descuento (o sin él)
 *******************************************************************/
session_start();
require_once __DIR__ . '/../cotizaciones/api/_node.php';

header('Content-Type: application/json; charset=utf-8');

// Ensure no PHP warnings/notices corrupt JSON responses.
ob_start();

function send_json($payload, int $code = 200)
{
  if (ob_get_length()) {
    ob_clean();
  }
  http_response_code($code);
  echo json_encode($payload);
  exit;
}

/*────────────── 1.  IDs de gasto ──────────────*/
$idGasto  = isset($_POST['idGasto']) ? intval($_POST['idGasto']) : null;
$idsGasto = $_POST['idsGasto'] ?? [];

/*────────────── 2.  Datos generales del pago ─*/
$fecha = $_POST['fecha'] ?? '';
$idMedio = $_POST['idMedio'] ?? '';

// Si el usuario eligió “Cruzar con Anticipo”
$metodoPago = $_POST['metodoPago'] ?? 'banco';
$idAnticipo = ($metodoPago === 'anticipo') ? intval($_POST['idAnticipo'] ?? 0) : 0;

if ($fecha === '') {
  send_json(['success' => false, 'msg' => 'Falta fecha'], 400);
}
if ($metodoPago !== 'anticipo' && $idMedio === '') {
  send_json(['success' => false, 'msg' => 'Falta banco'], 400);
}

$noComprobante = $_POST['noComprobante'] ?? '';
$idOrigen      = isset($_POST['idOrigen']) ? intval($_POST['idOrigen']) : 4;
$observaciones = $_POST['observaciones'] ?? '';

/*────────────── 3.  Arreglos por ítem ────────*/
$idsItem     = $_POST['itemId']         ?? [];
/*  saldoItem[] es el nuevo nombre; si el front aún envía totalItem[],
    usa ese array como respaldo.                                         */
$saldos      = $_POST['saldoItem']      ?? ($_POST['totalItem'] ?? []);
$descuentos  = $_POST['valorDescuento'] ?? [];
$tiposDesc   = $_POST['descuentoTipo']  ?? [];
$pagosNetos  = $_POST['valorPagado']    ?? [];

/* Validación mínima */
if (count($idsItem) === 0) {
  send_json(['success' => false, 'msg' => 'No se recibieron ítems'], 400);
}

// 4) Crear pago en Node (DB se maneja solo en Node)
$token = cpn_node_token_or_fail();
$nodeBase = cpn_node_api_base();

$payload = [
  'fecha' => $fecha,
  'noComprobante' => $noComprobante,
  'idOrigen' => $idOrigen,
  'idMedio' => $idMedio,
  'observaciones' => $observaciones,
  'metodoPago' => $metodoPago,
  'idAnticipo' => $idAnticipo,
  'idGasto' => $idGasto,
  'idsGasto' => $idsGasto,
  'itemId' => $idsItem,
  'itemGasto' => $_POST['itemGasto'] ?? [],
  'totalItem' => $_POST['totalItem'] ?? [],
  'saldoItem' => $saldos,
  'valorDescuento' => $descuentos,
  'descuentoTipo' => $tiposDesc,
  'valorPagado' => $pagosNetos,
];

$resp = cpn_node_request('POST', $nodeBase . '/api/pagos/procesar', $token, $payload);
if (!($resp['ok'] ?? false)) {
  $msg = $resp['error']['message'] ?? 'Error procesando pago';
  send_json(['success' => false, 'msg' => $msg], intval($resp['status'] ?? 500));
}

$idPago = intval($resp['data']['idPago'] ?? 0);
if ($idPago <= 0) {
  send_json(['success' => false, 'msg' => 'Respuesta inválida al crear pago'], 502);
}

/*────────────── 6.  Guardar soportes (opcional) ────*/
$uploadDir = __DIR__ . "/../archivoDigital/soportePagos/{$idPago}";
if (!is_dir($uploadDir)) {
  @mkdir($uploadDir, 0755, true);
}

$cantArch = 0;
$warnings = [];

if (!empty($_FILES['soportePago']['error']) && is_array($_FILES['soportePago']['error'])) {
  $idx = 1;
  foreach ($_FILES['soportePago']['error'] as $k => $err) {
    if ($err !== UPLOAD_ERR_OK) continue;
    $orig = $_FILES['soportePago']['name'][$k] ?: 'clipboard.png';
    $ext  = pathinfo($orig, PATHINFO_EXTENSION) ?: 'png';
    $ok = @move_uploaded_file(
      $_FILES['soportePago']['tmp_name'][$k],
      "{$uploadDir}/{$idPago}-{$idx}.{$ext}"
    );
    if (!$ok) {
      $warnings[] = 'No se pudo guardar un soporte del pago (archivo #' . $idx . ')';
      continue;
    }
    $idx++;
  }
  $cantArch = $idx - 1;
}

if ($cantArch > 0) {
  $resp2 = cpn_node_request(
    'PATCH',
    $nodeBase . '/api/pagos/' . $idPago . '/archivos',
    $token,
    ['archivos' => $cantArch]
  );
  if (!($resp2['ok'] ?? false)) {
    $msg = $resp2['error']['message'] ?? 'Error actualizando archivos del pago';
    // El pago ya fue creado; devolvemos success con warning para no dejar la UI “colgada”.
    $warnings[] = $msg;
  }
}

send_json(['success' => true, 'idPago' => $idPago, 'warnings' => $warnings]);
