<?php

namespace App\Livewire\Procesos;

use App\Models\Proceso;
use App\Models\ClienteCorporativo;
use App\Models\Deudor;
use App\Models\User;
use Livewire\Component;
use Livewire\WithPagination;

class ProcesoManager extends Component
{
    use WithPagination;

    // Filtros
    public string $search = '';
    public string $filterEstado = '';
    public string $filterCliente = '';
    public string $filterPrioridad = '';
    public string $filterSemaforo = '';

    // Modal crear/editar
    public bool $showModal = false;
    public bool $showDeleteModal = false;
    public ?int $editingId = null;
    public ?int $deletingId = null;

    // Formulario
    public $cliente_corporativo_id = '';
    public $deudor_id = '';
    public string $deudorSearch = '';
    public array $deudorResults = [];
    public $numero_obligacion = '';
    public $cuantia_total = '';
    public string $saldo_total     = '0'; // auto-calculado
    public string $saldo_intereses = '0';
    public string $saldo_capital   = '0';
    public $fecha_ingreso = '';
    public $fecha_vencimiento_terminos = '';
    public bool $tiene_deceval = false;
    public bool $pagare_virtual = false;
    public bool $con_escritura = false;
    public string $prioridad = 'media';
    public string $observaciones = '';

    protected function rules()
    {
        return [
            'cliente_corporativo_id' => 'required|exists:clientes_corporativos,id',
            'deudor_id' => 'required|exists:deudores,id',
            'saldo_capital' => 'required|numeric|min:0.01',
            'fecha_ingreso' => 'required|date',
            'fecha_vencimiento_terminos' => 'nullable|date|after_or_equal:fecha_ingreso',
        ];
    }

    protected $messages = [
        'cliente_corporativo_id.required' => 'Seleccione un cliente.',
        'deudor_id.required' => 'Seleccione un deudor.',
        'saldo_capital.required' => 'El Saldo Capital es obligatorio.',
        'saldo_capital.min' => 'El Saldo Capital debe ser mayor a 0.',
        'fecha_ingreso.required' => 'La fecha de ingreso es obligatoria.',
    ];

    public function updatedSearch()
    {
        $this->resetPage();
    }

    public function updatedFilterEstado()
    {
        $this->resetPage();
    }

    public function updatedFilterCliente()
    {
        $this->resetPage();
    }

    // --- Búsqueda deudor ---
    public function updatedDeudorSearch()
    {
        if (strlen($this->deudorSearch) >= 2) {
            $this->deudorResults = Deudor::where('nombre_completo', 'like', "%{$this->deudorSearch}%")
                ->orWhere('numero_documento', 'like', "%{$this->deudorSearch}%")
                ->limit(10)
                ->get()
                ->map(fn($d) => ['id' => $d->id, 'label' => "{$d->tipo_documento} {$d->numero_documento} — {$d->nombre_completo}"])
                ->toArray();
        } else {
            $this->deudorResults = [];
        }
    }

    public function selectDeudor($id)
    {
        $this->deudor_id = $id;
        $deudor = Deudor::find($id);
        $this->deudorSearch = $deudor ? "{$deudor->tipo_documento} {$deudor->numero_documento} — {$deudor->nombre_completo}" : '';
        $this->deudorResults = [];
    }

    // --- CRUD ---
    public function create()
    {
        $this->resetForm();
        $this->fecha_ingreso = now()->format('Y-m-d');
        $this->showModal = true;
    }

    public function edit($id)
    {
        $proceso = Proceso::findOrFail($id);
        $this->editingId = $id;
        $this->cliente_corporativo_id = $proceso->cliente_corporativo_id;
        $this->deudor_id = $proceso->deudor_id;
        $this->numero_obligacion = $proceso->numero_obligacion ?? '';
        $this->cuantia_total = $proceso->cuantia_total;
        $this->fecha_ingreso = $proceso->fecha_ingreso->format('Y-m-d');
        $this->fecha_vencimiento_terminos = $proceso->fecha_vencimiento_terminos?->format('Y-m-d') ?? '';
        $this->tiene_deceval = $proceso->tiene_deceval;
        $this->pagare_virtual = $proceso->pagare_virtual;
        $this->con_escritura = $proceso->con_escritura;
        $this->prioridad = $proceso->prioridad;
        $this->observaciones = $proceso->observaciones ?? '';

        $deudor = $proceso->deudor;
        $this->deudorSearch = $deudor ? "{$deudor->tipo_documento} {$deudor->numero_documento} — {$deudor->nombre_completo}" : '';
        $this->saldo_capital   = $proceso->saldo_capital ?? $proceso->cuantia_total ?? '0';
        $this->saldo_intereses = $proceso->saldo_intereses ?? '0';
        $this->saldo_total     = $proceso->saldo_total ?? $proceso->cuantia_total ?? '0';

        $this->showModal = true;
    }

    public function save()
    {
        $this->validate();

        $data = [
            'cliente_corporativo_id' => $this->cliente_corporativo_id,
            'deudor_id' => $this->deudor_id,
            'numero_obligacion' => $this->numero_obligacion ?: null,
            'cuantia_total'   => $this->saldo_total ?: $this->cuantia_total,
                'saldo_capital'   => $this->saldo_capital,
                'saldo_intereses' => $this->saldo_intereses,
                'saldo_total'     => $this->saldo_total,
            'fecha_ingreso' => $this->fecha_ingreso,
            'fecha_vencimiento_terminos' => $this->fecha_vencimiento_terminos ?: null,
            'tiene_deceval' => $this->tiene_deceval,
            'pagare_virtual' => $this->pagare_virtual,
            'con_escritura' => $this->con_escritura,
            'prioridad' => $this->prioridad,
            'observaciones' => $this->observaciones ?: null,
        ];

        if ($this->editingId) {
            $proceso = Proceso::findOrFail($this->editingId);
            $proceso->update($data);
            session()->flash('message', "Proceso {$proceso->radicado_interno} actualizado.");
        } else {
            $proceso = Proceso::create($data);
            session()->flash('message', "Proceso {$proceso->radicado_interno} creado exitosamente.");
        }

        $this->showModal = false;
        $this->resetForm();
    }

    public function confirmDelete($id)
    {
        $this->deletingId = $id;
        $this->showDeleteModal = true;
    }

    public function delete()
    {
        $proceso = Proceso::findOrFail($this->deletingId);
        $radicado = $proceso->radicado_interno;
        $proceso->delete();
        session()->flash('message', "Proceso {$radicado} eliminado.");
        $this->showDeleteModal = false;
        $this->deletingId = null;
    }

    private function resetForm()
    {
        $this->editingId = null;
        $this->cliente_corporativo_id = '';
        $this->deudor_id = '';
        $this->deudorSearch = '';
        $this->deudorResults = [];
        $this->numero_obligacion = '';
        $this->cuantia_total = '';
        $this->fecha_ingreso = '';
        $this->fecha_vencimiento_terminos = '';
        $this->tiene_deceval = false;
        $this->pagare_virtual = false;
        $this->con_escritura = false;
        $this->prioridad = 'media';
        $this->observaciones = '';
        $this->resetValidation();
    }

    public function render()
    {
        $query = Proceso::with(['cliente', 'deudor', 'asignacionesActivas.usuario'])
            ->when($this->search, function ($q) {
                $q->where(function ($sub) {
                    $sub->where('radicado_interno', 'like', "%{$this->search}%")
                        ->orWhere('radicado_juzgado', 'like', "%{$this->search}%")
                        ->orWhere('numero_obligacion', 'like', "%{$this->search}%")
                        ->orWhereHas('deudor', fn($d) =>
                            $d->where('nombre_completo', 'like', "%{$this->search}%")
                              ->orWhere('numero_documento', 'like', "%{$this->search}%")
                        );
                });
            })
            ->when($this->filterEstado, fn($q) => $q->where('estado', $this->filterEstado))
            ->when($this->filterCliente, fn($q) => $q->where('cliente_corporativo_id', $this->filterCliente))
            ->when($this->filterPrioridad, fn($q) => $q->where('prioridad', $this->filterPrioridad))
            ->orderBy('created_at', 'desc');

        // ════════ B5.3: KPIs Listado ════════
        // Calculo agregados sobre el query filtrado (clonado para no consumir el builder).
        $totalProcesos = (clone $query)->count();
        $totalDeuda    = (clone $query)->sum('cuantia_total');
        // ════════ FIN B5.3 ════════
        // Filtro semáforo post-query (se calcula dinámicamente)
        $procesos = $query->paginate(15);

        return view('livewire.procesos.proceso-manager', [
            'procesos' => $procesos,
            'clientes' => ClienteCorporativo::where('activo', true)->orderBy('nombre')->get(),
            'estados' => Proceso::ESTADOS,
            'prioridades' => Proceso::PRIORIDADES,
            'totalProcesos' => $totalProcesos,
            'totalDeuda' => $totalDeuda,
        ]);
    }
    // Auto-calcular saldo_total cuando cambia capital o intereses
    public function updatedSaldoCapital(): void
    {
        $this->recalcularTotal();
    }

    public function updatedSaldoIntereses(): void
    {
        $this->recalcularTotal();
    }

    private function recalcularTotal(): void
    {
        $capital   = (float) str_replace(',', '.', $this->saldo_capital   ?? '0');
        $intereses = (float) str_replace(',', '.', $this->saldo_intereses ?? '0');
        $this->saldo_total     = number_format($capital + $intereses, 2, '.', '');
        $this->cuantia_total  = $this->saldo_total; // sync para validación
    }
    private function generarConsecutivoYber(int $clienteId): string
    {
        try {
            $cliente = \App\Models\ClienteCorporativo::find($clienteId);
            if (!$cliente) return '';
            // Incrementar contador atómicamente
            \App\Models\ClienteCorporativo::where('id', $clienteId)
                ->increment('consecutivo_actual');
            $cliente->refresh();
            $prefijo = $cliente->codigo_carpeta ?: strtoupper(substr($cliente->nombre ?? 'CB', 0, 2));
            $anio    = date('Y');
            $numero  = str_pad($cliente->consecutivo_actual, 4, '0', STR_PAD_LEFT);
            return "{$prefijo}-{$anio}-{$numero}";
        } catch (\Exception $e) {
            return '';
        }
    }
    public function exportarExcel()
    {
        $procesos = \App\Models\Proceso::with(['cliente','deudor','asignaciones.usuario'])
            ->when($this->search, fn($q) => $q->where(function($sq) {
                $sq->where('radicado_interno','like','%'.$this->search.'%')
                   ->orWhereHas('deudor', fn($d) => $d->where('nombre_completo','like','%'.$this->search.'%'));
            }))
            ->when($this->filterEstado,  fn($q) => $q->where('estado', $this->filterEstado))
            ->when($this->filterCliente, fn($q) => $q->where('cliente_corporativo_id', $this->filterCliente))
            ->orderBy('created_at','desc')->get();

        $headers = ['Radicado','Consecutivo YBER','Cliente','Deudor','Documento',
                    'N° Obligacion','Saldo Capital','Intereses','Total Deuda',
                    'Estado','Prioridad','Dias','Fecha Ingreso',
                    'Juzgado','Radicado Juzgado','Docs Completos','Bloqueado','Razon Bloqueo'];

        $rows = $procesos->map(fn($p) => [
            $p->radicado_interno,
            $p->consecutivo_yber ?? '',
            $p->cliente->nombre ?? '',
            $p->deudor->nombre_completo ?? '',
            $p->deudor->documento_completo ?? '',
            $p->numero_obligacion ?? '',
            $p->saldo_capital ?? $p->cuantia_total ?? 0,
            $p->saldo_intereses ?? 0,
            $p->saldo_total ?? $p->cuantia_total ?? 0,
            $p->estado_label ?? $p->estado,
            \App\Models\Proceso::PRIORIDADES[$p->prioridad] ?? $p->prioridad,
            $p->fecha_ingreso ? now()->diffInDays($p->fecha_ingreso) : '',
            $p->fecha_ingreso?->format('d/m/Y') ?? '',
            $p->juzgado ?? '',
            $p->radicado_juzgado ?? '',
            $p->fecha_completitud_docs ? $p->fecha_completitud_docs->format('d/m/Y') : 'Pendiente',
            $p->flujo_bloqueado ? 'SI' : 'No',
            $p->razon_bloqueo ?? '',
        ]);

        return response()->streamDownload(function() use ($headers, $rows) {
            $h = fopen('php://output', 'w');
            fprintf($h, chr(0xEF).chr(0xBB).chr(0xBF));
            fputcsv($h, $headers, ';');
            foreach ($rows as $row) { fputcsv($h, $row->toArray(), ';'); }
            fclose($h);
        }, 'procesos_' . date('Ymd_His') . '.csv', ['Content-Type' => 'text/csv; charset=UTF-8']);
    }

    public function exportarBloqueados()
    {
        $procesos = \App\Models\Proceso::with(['cliente','deudor'])
            ->where('flujo_bloqueado', true)->orderBy('bloqueado_at','desc')->get();

        return response()->streamDownload(function() use ($procesos) {
            $h = fopen('php://output', 'w');
            fprintf($h, chr(0xEF).chr(0xBB).chr(0xBF));
            fputcsv($h, ['Radicado','Cliente','Deudor','Estado','Bloqueado el','Razon'], ';');
            foreach ($procesos as $p) {
                fputcsv($h, [
                    $p->radicado_interno,
                    $p->cliente->nombre ?? '',
                    $p->deudor->nombre_completo ?? '',
                    $p->estado_label ?? $p->estado,
                    $p->bloqueado_at?->format('d/m/Y H:i') ?? '',
                    $p->razon_bloqueo ?? '',
                ], ';');
            }
            fclose($h);
        }, 'bloqueados_' . date('Ymd') . '.csv');
    }

}
