<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Recibo;
use App\Models\Cliente;
use App\Models\Caja;
use App\Models\PagoDetalle;
use App\Models\PagoRecibo;
use App\Models\HistorialCaja;
use Illuminate\Support\Facades\DB;

class PagoController extends Controller
{
    /**
     * Mostrar vista de caja para un cliente específico
     */
    public function index()
{
    $pagos = PagoDetalle::with([
        'recibos.facturas.conexion.cliente',  // plural ahora
        'historialCaja.caja'
    ])->orderBy('id_pago', 'desc')->get();

    $cajaAbierta = Caja::where('estado', 'abierta')->first();

    return view('pagos.index', compact('pagos', 'cajaAbierta'));
}




   public function buscarRecibos($documento)
{
    // Buscar cliente por documento
    $cliente = Cliente::where('documento_identidad', $documento)->first();

    if (!$cliente) {
        return response()->json([
            'success' => false,
            'message' => 'Cliente no encontrado'
        ]);
    }

    // Traer recibos pendientes asociados a las facturas del cliente
    $recibos = Recibo::where('estado', 'Pendiente')
        ->whereHas('facturas.conexion', function ($q) use ($cliente) {
            $q->where('id_cliente', $cliente->id_cliente);
        })
        ->with(['facturas' => function ($q) {
            // IMPORTANTE: incluir la clave primaria de facturacion
            $q->select(
                'facturacion.id_factura',
                'facturacion.numero_factura',
                'facturacion.monto_total',
                'facturacion.estado'
            );
        }])
        ->get();

    // Calcular el monto total de cada recibo sumando las facturas asociadas
    foreach ($recibos as $recibo) {
        $recibo->monto_total = $recibo->facturas->sum('monto_total');
    }

    // Devolver respuesta JSON
    return response()->json([
        'success' => true,
        'cliente' => $cliente,
        'recibos' => $recibos
    ]);
}


public function store(Request $request)
{
    $request->validate([
        'recibos'     => 'required|array|min:1',  // esperamos varios recibos
        'recibos.*'   => 'exists:recibo,id_recibo',
        'metodo_pago' => 'required|string',
        'monto'       => 'required|numeric|min:0.1',
        'id_caja'     => 'required|exists:cajas,id_caja',
    ]);

    \DB::beginTransaction();

    try {
        // 1. Crear el pago general
        $pago = PagoDetalle::create([
            'metodo_pago' => $request->metodo_pago,
            'monto'       => $request->monto,
            'referencia'  => $request->referencia,
        ]);

        // 2. Procesar cada recibo seleccionado
        foreach ($request->recibos as $idRecibo) {
            $recibo = Recibo::with('facturas')->findOrFail($idRecibo);

            // Actualizar recibo
            $recibo->fecha_pago   = now();
            $recibo->monto_pagado = $recibo->facturas->sum('monto_total'); // total del recibo
            $recibo->forma_pago   = $request->metodo_pago;
            $recibo->estado       = 'Completado';
            $recibo->save();

            // Relación muchos a muchos pago-recibo
            \DB::table('pago_recibo')->insert([
                'id_pago'   => $pago->id_pago,
                'id_recibo' => $recibo->id_recibo,
            ]);

            // ✅ Actualizar facturas asociadas a Pagada
            foreach ($recibo->facturas as $factura) {
                $factura->estado = 'Pagada';
                $factura->save();
            }
        }

        // 3. Registrar movimiento en historial de caja
        $movimiento = HistorialCaja::create([
            'id_caja'    => $request->id_caja,
            'id_pago'    => $pago->id_pago,
            'tipo'       => 'ingreso',
            'concepto'   => 'Pago de ' . count($request->recibos) . ' recibo(s)',
            'monto'      => $request->monto,
            'referencia' => $request->referencia,
        ]);

        // 4. Actualizar saldo de caja
        $caja = Caja::findOrFail($request->id_caja);
        $caja->saldo_actual += $request->monto;
        $caja->save();

        \DB::commit();

        return response()->json([
            'success'    => true,
            'pago'       => $pago,
            'movimiento' => $movimiento
        ]);

    } catch (\Exception $e) {
        \DB::rollBack();
        return response()->json([
            'success' => false,
            'message' => 'Error al registrar el pago: ' . $e->getMessage()
        ], 500);
    }
}



public function imprimir($id)
{
    $pago = PagoDetalle::with([
        'recibos.facturas.conexion.cliente',
        'historialCaja.caja'
    ])->findOrFail($id);

    return view('pagos.imprimir', compact('pago'));
}

public function mostrarTicket($id)
{
    $pago = PagoDetalle::with([
        'recibos.facturas.conexion.cliente',
        'historialCaja.caja'
    ])->findOrFail($id);

    return view('pagos.ticket', compact('pago'));
}



}
