<?php

namespace App\Services;

use App\Models\Proceso;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;
use NumberFormatter;

class PlantillaService
{
    /**
     * Plantillas disponibles con su metadata
     */
    const PLANTILLAS = [
        'demanda_ejecutiva' => [
            'nombre' => 'Demanda Ejecutiva',
            'vista' => 'pdf.plantillas.demanda-ejecutiva',
            'descripcion' => 'Demanda ejecutiva singular - cobro de obligación',
            'requiere_estado' => ['redaccion', 'revision'],
        ],
        'poder' => [
            'nombre' => 'Poder Especial',
            'vista' => 'pdf.plantillas.poder',
            'descripcion' => 'Poder especial para actuar en proceso ejecutivo',
            'requiere_estado' => ['redaccion', 'revision'],
        ],
        'memorial' => [
            'nombre' => 'Memorial',
            'vista' => 'pdf.plantillas.memorial',
            'descripcion' => 'Memorial genérico dirigido al juzgado',
            'requiere_estado' => ['radicado', 'seguimiento', 'sentencia', 'liquidacion'],
        ],
        'subsanacion' => [
            'nombre' => 'Subsanación de Demanda',
            'vista' => 'pdf.plantillas.subsanacion',
            'descripcion' => 'Escrito de subsanación por inadmisión',
            'requiere_estado' => ['radicado', 'seguimiento'],
        ],
        'impulso' => [
            'nombre' => 'Impulso Procesal',
            'vista' => 'pdf.plantillas.impulso',
            'descripcion' => 'Solicitud de impulso al despacho judicial',
            'requiere_estado' => ['radicado', 'seguimiento', 'sentencia', 'liquidacion'],
        ],
        'oficio_embargo_banco' => [
            'nombre' => 'Oficio Embargo Cuentas Bancarias',
            'vista' => 'pdf.plantillas.oficio-embargo-banco',
            'descripcion' => 'Oficio para embargo de cuentas bancarias',
            'requiere_estado' => ['seguimiento'],
        ],
        'oficio_embargo_vehiculo' => [
            'nombre' => 'Oficio Embargo Vehículos (Tránsito)',
            'vista' => 'pdf.plantillas.oficio-embargo-vehiculo',
            'descripcion' => 'Oficio dirigido a Secretaría de Tránsito',
            'requiere_estado' => ['seguimiento'],
        ],
        'oficio_embargo_inmueble' => [
            'nombre' => 'Oficio Embargo Inmuebles (ORI)',
            'vista' => 'pdf.plantillas.oficio-embargo-inmueble',
            'descripcion' => 'Oficio a Oficina de Registro de Instrumentos Públicos',
            'requiere_estado' => ['seguimiento'],
        ],

        'acuerdo_pago' => [
            'nombre' => 'Acuerdo de Pago',
            'vista' => 'pdf.plantillas.acuerdo-pago',
            'descripcion' => 'Acuerdo de pago con deudor y codeudor',
            'requiere_estado' => ['recepcion', 'analisis', 'redaccion', 'revision', 'radicado', 'seguimiento', 'sentencia', 'liquidacion'],
        ],
        'requerimiento_pago' => [
            'nombre' => 'Requerimiento de Pago Prejudicial',
            'vista' => 'pdf.plantillas.requerimiento-pago',
            'descripcion' => 'Carta de cobro prejudicial con plazo de 15 días',
            'requiere_estado' => ['recepcion', 'analisis', 'redaccion'],
        ],
        'liquidacion_credito' => [
            'nombre' => 'Liquidación de Crédito',
            'vista' => 'pdf.plantillas.liquidacion-credito',
            'descripcion' => 'Detalle de capital, intereses, honorarios y costas',
            'requiere_estado' => ['analisis', 'redaccion', 'revision', 'radicado', 'seguimiento', 'sentencia', 'liquidacion'],
        ],
    ];

    /**
     * Obtener plantillas disponibles para un proceso según su estado
     */
    public static function plantillasDisponibles(Proceso $proceso): array
    {
        $disponibles = [];
        foreach (self::PLANTILLAS as $key => $plantilla) {
            if (in_array($proceso->estado, $plantilla['requiere_estado'])) {
                $disponibles[$key] = $plantilla;
            }
        }
        return $disponibles;
    }

    /**
     * Compilar las variables comunes de un proceso para todas las plantillas
     */
    public static function compilarVariables(Proceso $proceso): array
    {
        $proceso->load(['cliente', 'deudor', 'asignacionesActivas.usuario', 'ordenGestion']);

        // Obtener sustanciador asignado
        $sustanciador = $proceso->asignacionesActivas
            ->where('rol_asignado', 'sustanciador')
            ->first();

        // Formatear cuantía en letras
        $cuantiaLetras = self::numeroALetras($proceso->cuantia_total);

        // Ciudad del juzgado (extraer de nombre juzgado o default)
        $ciudadJuzgado = self::extraerCiudad($proceso->juzgado ?? '');

        return [
            // Proceso
            'radicado_interno' => $proceso->radicado_interno,
            'radicado_juzgado' => $proceso->radicado_juzgado ?? '____________________',
            'juzgado' => $proceso->juzgado ?? '____________________',
            'ciudad_juzgado' => $ciudadJuzgado ?: 'Bogotá D.C.',
            'cuantia_numero' => number_format($proceso->cuantia_total, 2, ',', '.'),
            'cuantia_letras' => $cuantiaLetras,
            'tipo_cuantia' => ucfirst($proceso->tipo_cuantia ?? $proceso->calcularTipoCuantia()),
            'numero_obligacion' => $proceso->numero_obligacion ?? '____________________',
            'fecha_ingreso' => $proceso->fecha_ingreso?->format('d/m/Y') ?? '____',
            'etapa_procesal' => $proceso->etapa_procesal ?? 'N/A',

            // Deudor
            'deudor_nombre' => $proceso->deudor->nombre_completo ?? '____________________',
            'deudor_tipo_doc' => $proceso->deudor->tipo_documento ?? 'C.C.',
            'deudor_documento' => $proceso->deudor->numero_documento ?? '____________________',
            'deudor_direccion' => $proceso->deudor->direccion_notificacion ?? '____________________',
            'deudor_ciudad' => $proceso->deudor->ciudad ?? '____________________',
            'deudor_email' => $proceso->deudor->email ?? '',
            'deudor_telefono' => $proceso->deudor->telefono ?? '',

            // Cliente Corporativo (demandante)
            'cliente_nombre' => $proceso->cliente->nombre ?? '____________________',
            'cliente_nit' => $proceso->cliente->nit ?? '____________________',
            'cliente_contacto' => $proceso->cliente->contacto_nombre ?? '',

            // Extras FO
            'tiene_deceval' => $proceso->tiene_deceval ? 'Sí' : 'No',
            'pagare_virtual' => $proceso->pagare_virtual ? 'Sí' : 'No',
            'con_escritura' => $proceso->con_escritura ? 'Sí' : 'No',

            // Abogado
            'abogado_nombre' => $sustanciador?->usuario?->name ?? '____________________',
            'abogado_cc' => '',

            // Fechas
            'fecha_actual' => now()->translatedFormat('d \d\e F \d\e Y'),
            'dia_actual' => now()->format('d'),
            'mes_actual' => now()->translatedFormat('F'),
            'anio_actual' => now()->format('Y'), // Se puede agregar campo a users en futuro

            // Codeudor (si existe relación)
            'nombre_codeudor' => $proceso->deudor->codeudor_nombre ?? '',
            'documento_codeudor' => $proceso->deudor->codeudor_documento ?? '',
            'tipo_doc_codeudor' => $proceso->deudor->codeudor_tipo_doc ?? 'C.C.',

            // Fechas
            'fecha_hoy' => Carbon::now()->locale('es')->isoFormat('D [de] MMMM [de] YYYY'),
            'fecha_hoy_corta' => Carbon::now()->format('d/m/Y'),
            'anio_actual' => date('Y'),

            // Observaciones
            'observaciones' => $proceso->observaciones ?? '',
        ];
    }

    /**
     * Generar PDF de una plantilla
     */
    public static function generarPdf(Proceso $proceso, string $tipoPlantilla): \Barryvdh\DomPDF\PDF
    {
        $config = self::PLANTILLAS[$tipoPlantilla] ?? null;
        if (!$config) {
            throw new \Exception("Plantilla '{$tipoPlantilla}' no existe.");
        }

        $variables = self::compilarVariables($proceso);
        $variables['tipo_plantilla'] = $tipoPlantilla;
        $variables['nombre_plantilla'] = $config['nombre'];

        $pdf = Pdf::loadView($config['vista'], $variables);
        $pdf->setPaper('letter', 'portrait');
        $pdf->setOption('defaultFont', 'DejaVu Sans');
        $pdf->setOption('isRemoteEnabled', true);

        return $pdf;
    }

    /**
     * Convertir número a letras (español colombiano simplificado)
     */
    public static function numeroALetras(float $numero): string
    {
        if (class_exists('NumberFormatter')) {
            $formatter = new NumberFormatter('es_CO', NumberFormatter::SPELLOUT);
            $entero = (int) $numero;
            $letras = $formatter->format($entero);
            return mb_strtoupper($letras) . ' PESOS M/CTE';
        }

        // Fallback simple
        return number_format($numero, 0, '', '.') . ' PESOS M/CTE';
    }

    /**
     * Extraer ciudad del nombre del juzgado
     */
    private static function extraerCiudad(string $juzgado): string
    {
        // Patrones comunes: "Juzgado 3 Civil Municipal de Bogotá"
        if (preg_match('/de\s+(.+)$/i', $juzgado, $matches)) {
            return trim($matches[1]);
        }
        return '';
    }
}
