<?php 
ob_start();
session_start();

include ("../_init.php");
include("conexion3.php");

// --- Seguridad / permisos ---
if (!is_loggedin()) {
  redirect(root_url() . '/index.php?redirect_to=' . url());
}
if (user_group_id() != 1 && !has_permission('access', 'read_supplier')) {
  redirect(root_url() . '/'.ADMINDIRNAME.'/dashboard.php');
}

// --- Proveedor requerido ---
if (!isset($_GET['proveedor_id'])) {
  die('Proveedor no especificado.');
}
$proveedor_id = (int)$_GET['proveedor_id'];

// =================== POST: Registrar Pago ===================
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['registrar_pago'])) {

  // --------- Captura de datos base del pago ----------
  $fecha       = $_POST['fecha'] ?? date('Y-m-d');
  $caja        = trim($_POST['caja'] ?? 'Caja General');
  $importe     = (float)($_POST['importe'] ?? 0);
  $nota        = trim($_POST['nota'] ?? '');
  $forma_pago  = $_POST['forma_pago'] ?? 'efectivo';
  $factura_id  = isset($_POST['factura_id']) && $_POST['factura_id'] !== '' ? (int)$_POST['factura_id'] : null;

  // ---------- Validaciones mínimas ----------
  $errores = [];
  if (!$fecha)                 $errores[] = "Fecha inválida.";
  if ($importe <= 0)           $errores[] = "El importe debe ser mayor a 0.";
  if (!$forma_pago)            $errores[] = "Forma de pago inválida.";

  // ---------- Si es cheque: validar suma de cheques ----------
  $cheques = [];
  $suma_cheques = 0.0;
  if ($forma_pago === 'cheque') {
    if (isset($_POST['cheques']) && is_array($_POST['cheques']) && count($_POST['cheques']) > 0) {
      foreach ($_POST['cheques'] as $i => $ch) {
        $imp           = isset($ch['importe']) ? (float)$ch['importe'] : 0.0;
        $numero        = trim($ch['numero'] ?? '');
        $fecha_emision = trim($ch['fecha_emision'] ?? '');
        $fecha_cobro   = trim($ch['fecha_cobro'] ?? '');

        // Extras (opcionales)
        $titular       = trim($ch['titular_cuenta'] ?? '');
        $beneficiario  = trim($ch['beneficiario'] ?? '');
        $cuit          = trim($ch['cuit'] ?? '');
        $banco         = trim($ch['banco'] ?? '');
        $origen        = trim($ch['origen_cheque'] ?? '');
        $tipo_cheque   = trim($ch['tipo_cheque'] ?? '');
        $tipo_pago_ch  = trim($ch['tipo_pago'] ?? '');

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

        $suma_cheques += $imp;
        $cheques[] = [
          'importe'        => $imp,
          'numero'         => $numero,
          'fecha_emision'  => $fecha_emision,
          'fecha_cobro'    => $fecha_cobro,
          'titular'        => $titular,
          'beneficiario'   => $beneficiario,
          'cuit'           => $cuit,
          'banco'          => $banco,
          'origen'         => $origen,
          'tipo_cheque'    => $tipo_cheque,
          'tipo_pago'      => $tipo_pago_ch,
        ];
      }

      // Tolerancia de 1 centavo
      if (abs($suma_cheques - $importe) > 0.01) {
        $errores[] = "La suma de cheques ($".number_format($suma_cheques,2).") no coincide con el importe del pago ($".number_format($importe,2).").";
      }
    } else {
      $errores[] = "Debe cargar al menos un cheque.";
    }
  }

  if (!empty($errores)) {
    echo "<div class='alert alert-danger'><strong>No se pudo registrar el pago:</strong><br>".implode("<br>", array_map('htmlspecialchars',$errores))."</div>";
  } else {
    // =================== Transacción ===================
    $conn->begin_transaction();
    try {
      // --- Insert pago (pagos_facturas) ---
      $sqlPago = "INSERT INTO pagos_facturas (proveedor_id, factura_id, fecha, caja, importe, nota) 
                  VALUES (?, ?, ?, ?, ?, ?)";
      $stmtPago = $conn->prepare($sqlPago);
      // factura_id puede ser NULL
      if ($factura_id === null) {
        $null = null;
        $stmtPago->bind_param("isssds", $proveedor_id, $null, $fecha, $caja, $importe, $nota);
      } else {
        $stmtPago->bind_param("iissds", $proveedor_id, $factura_id, $fecha, $caja, $importe, $nota);
      }
      if (!$stmtPago->execute()) {
        throw new Exception("Error al insertar el pago: ".$stmtPago->error);
      }
      $pago_id = $stmtPago->insert_id;
      $stmtPago->close();

      // --- Si es cheque: insertar todos los cheques ---
      if ($forma_pago === 'cheque' && count($cheques) > 0) {
        $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 as $ch) {
          $imp  = (float)$ch['importe'];
          $num  = $ch['numero'];
          $fe   = $ch['fecha_emision'];
          $fc   = $ch['fecha_cobro'];
          $tit  = $ch['titular'] ?: null;
          $ben  = $ch['beneficiario'] ?: null;
          $cuit = $ch['cuit'] ?: null;
          $ban  = $ch['banco'] ?: null;
          $org  = $ch['origen'] ?: null;
          $tch  = $ch['tipo_cheque'] ?: null;
          $tp   = $ch['tipo_pago'] ?: null;

          // bind_param no distingue NULL vs string fácilmente; si querés estrictamente NULL, podés setear valores a NULL y usar ->send_long_data si fuera necesario.
          $stmtCh->bind_param(
            "idssssssssss",
            $pago_id, $imp, $fe, $fc, $tit, $tch, $org, $num, $cuit, $ben, $tp, $ban
          );
          if (!$stmtCh->execute()) {
            throw new Exception("Error al insertar cheque (N° ".$num."): ".$stmtCh->error);
          }
        }
        $stmtCh->close();
      }

      // --- Recalcular pagado de la factura (si corresponde) ---
      if ($factura_id !== null) {
        $sqlUpd = "UPDATE facturas 
                   SET pagado = (SELECT IFNULL(SUM(importe),0) FROM pagos_facturas WHERE factura_id = ?) 
                   WHERE id = ?";
        $stmtUpd = $conn->prepare($sqlUpd);
        $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();
      }

      // --- OK ---
      $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>";
    }
  }
}

// =================== Render habitual de la página ===================
$document->setTitle(trans('Proveedores'));
include("header.php"); 
include("left_sidebar.php");
?>

<div class="content-wrapper">
  <section class="content-header">
    <h1>
      <?php echo trans('Proveedores'); ?>
      <small><?php echo store('name'); ?></small>
    </h1>
    <ol class="breadcrumb">
      <li><a href="dashboard.php"><i class="fa fa-dashboard"></i> Inicio</a></li>
      <li class="active">Proveedores</li>
    </ol>
  </section>

  <section class="content">
    <div class="box box-info">
      <div class="box-header with-border">
        <h3 class="box-title">
          <span class="fa fa-fw fa-plus"></span> Facturas Proveedores
        </h3>
      </div>
      <div class="box-body">
        <?php include('estado_cuenta.php'); ?>
      </div>
    </div>
  </section>
</div>

<?php include("footer.php"); ?>
