<?php
session_start();
include 'conexion3.php';

// === INPUT ===
$proveedor_id = isset($_POST['proveedor_id']) ? (int)$_POST['proveedor_id'] : 0;
$factura_id   = (isset($_POST['factura_id']) && $_POST['factura_id'] !== '') ? (int)$_POST['factura_id'] : null;
$fecha        = isset($_POST['fecha']) ? trim($_POST['fecha']) : date('Y-m-d');
$importe      = isset($_POST['importe']) ? (float)$_POST['importe'] : 0;
$forma_pago   = isset($_POST['forma_pago']) ? trim($_POST['forma_pago']) : '';
$account_id   = isset($_POST['account_id']) ? (int)$_POST['account_id'] : 0;
$nota         = isset($_POST['nota']) ? trim($_POST['nota']) : '';

// Cheques seleccionados del inventario
$selected_cheques = isset($_POST['selected_cheques']) && is_array($_POST['selected_cheques']) ? array_map('intval', $_POST['selected_cheques']) : array();

// Cheques cargados manualmente (mismo formulario)
$manual_cheques = isset($_POST['manual_cheques']) && is_array($_POST['manual_cheques']) ? $_POST['manual_cheques'] : array();

// === Validaciones ===
$errores = array();
if ($proveedor_id <= 0) $errores[] = "Proveedor inválido.";
if (!$fecha)            $errores[] = "Fecha inválida.";
if (!$forma_pago)       $errores[] = "Forma de pago inválida.";
if ($account_id <= 0)   $errores[] = "Debe seleccionar una caja/cuenta.";
if ($importe <= 0)      $errores[] = "El importe debe ser mayor a 0.";

// Obtener nombre de caja
$caja_nombre = "Cuenta #$account_id";
$rsAcc = $conn->query("SELECT account_name FROM bank_account WHERE id = $account_id");
if ($rsAcc && $rsAcc->num_rows > 0) {
  $rowAcc = $rsAcc->fetch_assoc();
  if (!empty($rowAcc['account_name'])) $caja_nombre = $rowAcc['account_name'];
}

// === Si es cheque: comprobar suma ===
$total_cheques = 0.0;
$cheques_rows = array(); // filas de cheques (inventario) para luego grabar y actualizar

if ($forma_pago === 'cheque') {
  // 1) Cheques seleccionados del inventario
  if (!empty($selected_cheques)) {
    $ids = implode(',', array_map('intval', $selected_cheques));
    $sqlSel = "
      SELECT cheque_id, numero, fecha, fecha_pago, importe, cuit, caja_id, status
      FROM cheques
      WHERE cheque_id IN ($ids)
        AND (status = 'disponible' OR status = 'Disponible' OR status IS NULL OR status = '')
    ";
    if ($rs = $conn->query($sqlSel)) {
      while ($r = $rs->fetch_assoc()) {
        $cheques_rows[] = $r;
        $total_cheques += (float)$r['importe'];
      }
    }
    // validar que todos los seleccionados se hayan encontrado como disponibles
    if (count($cheques_rows) !== count($selected_cheques)) {
      $errores[] = "Uno o más cheques seleccionados no están disponibles.";
    }
  }

  // 2) Cheques manuales
  if (!empty($manual_cheques)) {
    foreach ($manual_cheques as $i => $ch) {
      $imp  = isset($ch['importe']) ? (float)$ch['importe'] : 0;
      $num  = trim($ch['numero'] ?? '');
      $fe   = trim($ch['fecha_emision'] ?? '');
      $fc   = trim($ch['fecha_cobro'] ?? '');

      if ($imp <= 0)           $errores[] = "El cheque manual #".($i+1)." tiene importe inválido.";
      if ($num === '')         $errores[] = "El cheque manual #".($i+1)." requiere número.";
      if ($fe === '' || $fc === '') $errores[] = "El cheque manual #".($i+1)." requiere fecha de emisión y cobro.";

      $total_cheques += $imp;
    }
  }

  // 3) Comparar suma contra importe del pago (tolerancia 1 centavo)
  if (abs($total_cheques - $importe) > 0.01) {
    $errores[] = "La suma de cheques ($".number_format($total_cheques,2).") no coincide con el importe del pago ($".number_format($importe,2).").";
  }
}

if (!empty($errores)) {
  echo "<div class='alert alert-danger'><strong>No se pudo registrar el pago:</strong><br>";
  foreach ($errores as $e) echo htmlspecialchars($e)."<br>";
  echo "</div><p><a href='javascript:history.back()' class='btn btn-default'>Volver</a></p>";
  exit;
}

// === Transacción ===
$conn->begin_transaction();
try {
  // Insert pago en pagos_facturas (usamos la estructura clásica sin columnas extra)
  if (is_null($factura_id)) {
    $stmt = $conn->prepare("INSERT INTO pagos_facturas (proveedor_id, factura_id, fecha, caja, importe, nota) VALUES (?, NULL, ?, ?, ?, ?)");
    if (!$stmt) throw new Exception("Error al preparar inserción de pago: ".$conn->error);
    $stmt->bind_param("issds", $proveedor_id, $fecha, $caja_nombre, $importe, $nota);
  } else {
    $stmt = $conn->prepare("INSERT INTO pagos_facturas (proveedor_id, factura_id, fecha, caja, importe, nota) VALUES (?, ?, ?, ?, ?, ?)");
    if (!$stmt) throw new Exception("Error al preparar inserción de pago: ".$conn->error);
    $stmt->bind_param("iissds", $proveedor_id, $factura_id, $fecha, $caja_nombre, $importe, $nota);
  }
  if (!$stmt->execute()) throw new Exception("Error al insertar el pago: ".$stmt->error);
  $pago_id = $stmt->insert_id;
  $stmt->close();

  // Si es cheque: grabar detalle en cheques_proveedores + actualizar estado de cheques inventario
  if ($forma_pago === 'cheque') {
    // 1) Cheques seleccionados (inventario)
    if (!empty($cheques_rows)) {
      $sqlCh = "INSERT INTO cheques_proveedores
                  (pago_id, importe_cheque, fecha_emision, fecha_cobro, titular_cuenta,
                   tipo_cheque, origen_cheque, numero_cheque, cuit, beneficiario, tipo_pago, banco)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
      $stmtCh = $conn->prepare($sqlCh);
      if (!$stmtCh) throw new Exception("Error al preparar inserción de cheques: ".$conn->error);

      foreach ($cheques_rows as $r) {
        $imp = (float)$r['importe'];
        $num = (string)$r['numero'];
        $fe  = (string)$r['fecha'];
        $fc  = (string)$r['fecha_pago'];

        $tit = null; $tcheque = null; $orig = 'inventario'; $cuit = (string)$r['cuit'];
        $ben = null; $tpago = null;    $ban  = null;

        $stmtCh->bind_param("idssssssssss",
          $pago_id, $imp, $fe, $fc, $tit, $tcheque, $orig, $num, $cuit, $ben, $tpago, $ban
        );
        if (!$stmtCh->execute()) throw new Exception("Error al insertar cheque N° ".$num.": ".$stmtCh->error);

        // marcar como usado en inventario
        $cid = (int)$r['cheque_id'];
        if (!$conn->query("UPDATE cheques SET status = 'utilizado' WHERE cheque_id = $cid")) {
          throw new Exception("Error al actualizar estado de cheque ID $cid: ".$conn->error);
        }
      }
      $stmtCh->close();
    }

    // 2) Cheques manuales
    if (!empty($manual_cheques)) {
      $sqlChm = "INSERT INTO cheques_proveedores
                  (pago_id, importe_cheque, fecha_emision, fecha_cobro, titular_cuenta,
                   tipo_cheque, origen_cheque, numero_cheque, cuit, beneficiario, tipo_pago, banco)
                 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
      $stmtChm = $conn->prepare($sqlChm);
      if (!$stmtChm) throw new Exception("Error al preparar inserción de cheques manuales: ".$conn->error);

      foreach ($manual_cheques as $ch) {
        $imp  = isset($ch['importe']) ? (float)$ch['importe'] : 0;
        $num  = trim($ch['numero'] ?? '');
        $fe   = trim($ch['fecha_emision'] ?? '');
        $fc   = trim($ch['fecha_cobro'] ?? '');

        $tit  = trim($ch['titular_cuenta'] ?? '');
        $ben  = trim($ch['beneficiario'] ?? '');
        $cuit = trim($ch['cuit'] ?? '');
        $ban  = trim($ch['banco'] ?? '');
        $org  = trim($ch['origen_cheque'] ?? '');
        $tch  = trim($ch['tipo_cheque'] ?? '');
        $tp   = trim($ch['tipo_pago'] ?? '');

        $stmtChm->bind_param("idssssssssss",
          $pago_id, $imp, $fe, $fc, $tit, $tch, $org, $num, $cuit, $ben, $tp, $ban
        );
        if (!$stmtChm->execute()) throw new Exception("Error al insertar cheque manual N° ".$num.": ".$stmtChm->error);
      }
      $stmtChm->close();
    }
  }

  // Recalcular pagado si hay factura
  if (!is_null($factura_id)) {
    $stmtUpd = $conn->prepare("
      UPDATE facturas 
      SET pagado = (SELECT IFNULL(SUM(importe),0) FROM pagos_facturas WHERE factura_id = ?)
      WHERE id = ?
    ");
    if (!$stmtUpd) throw new Exception("Error al preparar actualización de factura: ".$conn->error);
    $stmtUpd->bind_param("ii", $factura_id, $factura_id);
    if (!$stmtUpd->execute()) throw new Exception("Error al actualizar total pagado en factura: ".$stmtUpd->error);
    $stmtUpd->close();
  }

  $conn->commit();
  header("Location: cuenta_proveedor.php?proveedor_id=".$proveedor_id);
  exit;

} catch (Exception $e) {
  $conn->rollback();
  echo "<div class='alert alert-danger'><strong>Error:</strong> ".htmlspecialchars($e->getMessage())."</div>";
  echo "<p><a href='javascript:history.back()' class='btn btn-default'>Volver</a></p>";
  exit;
}
