<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Helpers\FechaHelper;
use App\Helpers\LiteralHelper;
use Barryvdh\DomPDF\Facade\Pdf;

class ContratoReporteController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    // ── Contrato firmable (equivale a rtf.php) ────────────────────────────
    public function contratoPdf(int $idContrato)
    {
        $datos = $this->getDatosContrato($idContrato);
        if (!$datos) abort(404, 'Contrato no encontrado.');

        // Seleccionar vista según urbanización
        $vista = match((int)$datos['contrato']->urbanizacion) {
            1  => 'contratos.pdf.contrato_cosmos',
            10 => 'contratos.pdf.contrato_tarapaca',
            default => 'contratos.pdf.contrato_cosmos',
        };

        $pdf = Pdf::loadView($vista, $datos)->setPaper('letter', 'portrait');
        return $pdf->stream("contrato_{$idContrato}.pdf");
    }

    // ── Registro interno (equivale a registrocontrato.php) ────────────────
    public function registroPdf(int $idContrato)
    {
        $datos = $this->getDatosContrato($idContrato);
        if (!$datos) abort(404, 'Contrato no encontrado.');

        // Usamos la vista específica de registro
        $pdf = Pdf::loadView('contratos.pdf.registro', $datos)
                  ->setPaper('letter', 'portrait');

        return $pdf->stream("registro_contrato_{$idContrato}.pdf");
    }

    // ── Datos para todos los PDFs ─────────────────────────────────────────
    private function getDatosContrato(int $idContrato): ?array
    {
        $contrato = DB::table('contratos')->where('id', $idContrato)->first();
        if (!$contrato) return null;

        $cliente = DB::table('clientes')->where('id', $contrato->idcliente)->first();

        $ciudad = null;
        if ($cliente?->ciudad) {
            $ciudad = DB::table('ciudades')->where('codigociu', $cliente->ciudad)->first();
        }

        $urbanizacion = DB::table('urbanizaciones')->where('id', $contrato->urbanizacion)->first();
        $distrito = DB::table('distritos')->where('id', $contrato->distrito)->first();
        $lote = DB::table('lotes')->where('id', $contrato->idlote)->first();

        $vendedor = $contrato->idvendedor
            ? DB::table('vendedores')->where('id', $contrato->idvendedor)->first()
            : null;

        $codeudores = DB::table('codeudores')
            ->join('clientes', 'codeudores.idcliente', '=', 'clientes.id')
            ->where('codeudores.idcontrato', $idContrato)
            ->select('clientes.nombre', 'clientes.ci', 'clientes.id as idcli')
            ->get();

        $extractos = DB::table('extractos')
            ->where('idcontrato', $idContrato)->where('anulado', 0)
            ->orderBy('numcuo')->get();
            
        $totalCargos    = $extractos->sum('cargo');
        $totalAbonos    = $extractos->sum('abono');
        $saldoPendiente = $totalCargos - $totalAbonos;

        // --- Lógica adicional para Registro de Contrato ---
        $planPago = ($contrato->numcuotas > 1) ? 'CRÉDITO' : 'CONTADO';
        
        $obs = $contrato->observaciones ?? '';
        $obs1 = substr($obs, 0, 45);
        $obs2 = substr($obs, 45, 45);
        $obs3 = substr($obs, 90, 45);

        // Fecha y Montos
        $partes = explode('-', $contrato->fecha ?? '0000-00-00');
        $mes = (int)($partes[1] ?? 0);
        $monto = (float)($contrato->total ?? 0);
        $cuotaInicial = (float)($contrato->cuotainicial ?? 0);
        $noCuotas = (int)($contrato->numcuotas ?? 0);

        $nomCiudad = $ciudad->nombreciu ?? '';
        $ciComprador = trim(($cliente->ci ?? '') . ' ' . $nomCiudad);

        return [
            'contrato'        => $contrato,
            'idContrato'      => $idContrato,
            'fechaLocal'      => FechaHelper::bdToLocal($contrato->fecha ?? ''),
            'dia'             => (int)($partes[2] ?? 0),
            'mes'             => $mes,
            'anio'            => (int)($partes[0] ?? 0),
            'mesLiteral'      => LiteralHelper::mesLiteral($mes),
            'planPago'         => $planPago,
            'obs1'             => $obs1,
            'obs2'             => $obs2,
            'obs3'             => $obs3,

            'cliente'         => $cliente,
            'nomComprador'    => $cliente->nombre ?? '—',
            'nombreCliente'   => $cliente->nombre ?? '—', // Alias para compatibilidad
            'ciComprador'     => $ciComprador,
            'ciudad'          => $ciudad,
            'nomCiudad'       => $nomCiudad,

            'codeudores'      => $codeudores,

            'lote'            => $lote,
            'nomLote'         => $contrato->lote ?? '',
            'manzano'         => $contrato->manzano ?? '',
            'superficie'      => $contrato->superficie ?? 0,
            'urbanizacion'    => $urbanizacion,
            'nomUrb'          => $urbanizacion->nombre ?? '—',
            'distrito'        => $distrito,
            'nomDis'          => $distrito->nombre ?? '—',

            'monto'           => $monto,
            'literalMonto'    => LiteralHelper::num2letras($monto),
            'cuotaInicial'    => $cuotaInicial,
            'literalCuotaIni' => LiteralHelper::num2letras($cuotaInicial),
            'noCuotas'        => $noCuotas,
            'literalNoCuotas' => LiteralHelper::num3letras($noCuotas),
            'montoResto'      => $monto - $cuotaInicial,
            'literalResto'    => LiteralHelper::num2letras($monto - $cuotaInicial),
            'cuotaMensual'    => (float)($contrato->cuotamensual ?? 0),

            'vendedor'        => $vendedor,
            'nomVendedor'     => $vendedor->nombre ?? 'Desconocido',

            'extractos'       => $extractos,
            'totalCargos'     => $totalCargos,
            'totalAbonos'     => $totalAbonos,
            'saldoPendiente'  => $saldoPendiente,

            'usuarioImprime'  => auth()->user()->nombre . ' ' . (auth()->user()->apellidos ?? ''),
            'fechaImpresion'  => now('America/La_Paz')->format('d/m/Y'),
            'horaImpresion'   => now('America/La_Paz')->format('H:i:s'),
        ];
    }
}