<?php

namespace App\Livewire\Acuerdos;

use App\Models\AcuerdoPago;
use App\Models\CuotaAcuerdo;
use App\Models\Proceso;
use Carbon\Carbon;
use Livewire\Component;

class AcuerdosManager extends Component
{
    public Proceso $proceso;

    // Modal estados
    public bool $showCreateModal = false;
    public bool $showCuotasModal = false;
    public bool $showPagoModal = false;

    public ?int $acuerdoActivoId = null;
    public ?int $cuotaActivaId = null;

    // Formulario crear
    public string $tipo_acuerdo = 'extrajudicial_privado';
    public string $etapa_caso = 'proceso_judicial';
    public string $fecha_firma = '';
    public string $monto_acordado = '';
    public int $numero_cuotas = 12;
    public string $fecha_primera_cuota = '';
    public string $periodicidad = 'mensual';
    public string $numero_radicado = '';
    public string $juzgado = '';
    public string $observaciones = '';

    // Formulario pago
    public string $pago_fecha = '';
    public string $pago_monto = '';
    public string $pago_observaciones = '';

    protected function rules(): array
    {
        return [
            'tipo_acuerdo' => 'required|in:extrajudicial_privado,extrajudicial_notariado,conciliacion_extrajudicial,conciliacion_judicial',
            'etapa_caso' => 'required|in:gestion_extrajudicial,proceso_judicial',
            'fecha_firma' => 'required|date',
            'monto_acordado' => 'required|numeric|min:1',
            'numero_cuotas' => 'required|integer|min:1|max:120',
            'fecha_primera_cuota' => 'required|date',
            'periodicidad' => 'required|in:semanal,quincenal,mensual',
            'numero_radicado' => 'nullable|string|max:50',
            'juzgado' => 'nullable|string|max:200',
            'observaciones' => 'nullable|string',
        ];
    }

    public function mount(Proceso $proceso)
    {
        $this->proceso = $proceso;
        $this->resetForm();
    }

    public function resetForm()
    {
        $this->tipo_acuerdo = 'extrajudicial_privado';
        $this->etapa_caso = 'proceso_judicial';
        $this->fecha_firma = now()->toDateString();
        $this->monto_acordado = number_format((float) $this->proceso->saldo_total, 2, '.', '');
        $this->numero_cuotas = 12;
        $this->fecha_primera_cuota = now()->addMonth()->toDateString();
        $this->periodicidad = 'mensual';
        $this->numero_radicado = $this->proceso->radicado_juzgado ?? '';
        $this->juzgado = $this->proceso->juzgado ?? '';
        $this->observaciones = '';
        $this->resetValidation();
    }

    public function openCreate()
    {
        $this->resetForm();
        $this->showCreateModal = true;
    }

    public function closeCreate()
    {
        $this->showCreateModal = false;
        $this->resetValidation();
    }

    public function guardarAcuerdo()
    {
        $datos = $this->validate();

        $monto = (float) $datos['monto_acordado'];
        $cuotas = (int) $datos['numero_cuotas'];
        $valorCuota = round($monto / $cuotas, 2);

        $acuerdo = AcuerdoPago::create([
            'proceso_id' => $this->proceso->id,
            'user_id' => auth()->id(),
            'tipo_acuerdo' => $datos['tipo_acuerdo'],
            'etapa_caso' => $datos['etapa_caso'],
            'fecha_firma' => $datos['fecha_firma'],
            'monto_acordado' => $monto,
            'numero_cuotas' => $cuotas,
            'valor_cuota' => $valorCuota,
            'fecha_primera_cuota' => $datos['fecha_primera_cuota'],
            'periodicidad' => $datos['periodicidad'],
            'numero_radicado' => $datos['numero_radicado'] ?: null,
            'juzgado' => $datos['juzgado'] ?: null,
            'observaciones' => $datos['observaciones'] ?: null,
            'estado' => 'vigente',
        ]);

        // Generar las N cuotas automaticamente
        $this->generarCuotas($acuerdo);

        $this->showCreateModal = false;
        session()->flash('message', 'Acuerdo creado correctamente con ' . $cuotas . ' cuotas.');
    }

    private function generarCuotas(AcuerdoPago $acuerdo)
    {
        $fecha = Carbon::parse($acuerdo->fecha_primera_cuota);
        $monto = (float) $acuerdo->monto_acordado;
        $cuotas = $acuerdo->numero_cuotas;
        $valorCuota = round($monto / $cuotas, 2);

        // Acumulado para que la ultima cuota ajuste centavos
        $acumulado = 0;

        for ($i = 1; $i <= $cuotas; $i++) {
            $esUltima = ($i === $cuotas);
            $montoEstaCuota = $esUltima
                ? round($monto - $acumulado, 2)
                : $valorCuota;
            $acumulado += $montoEstaCuota;

            CuotaAcuerdo::create([
                'acuerdo_id' => $acuerdo->id,
                'numero_cuota' => $i,
                'fecha_vencimiento' => $fecha->copy()->toDateString(),
                'monto_cuota' => $montoEstaCuota,
                'estado' => 'pendiente',
            ]);

            // Avanzar fecha segun periodicidad
            $fecha = match ($acuerdo->periodicidad) {
                'semanal' => $fecha->addWeek(),
                'quincenal' => $fecha->addDays(15),
                'mensual' => $fecha->addMonth(),
                default => $fecha->addMonth(),
            };
        }
    }

    public function verCuotas(int $acuerdoId)
    {
        $this->acuerdoActivoId = $acuerdoId;
        $this->showCuotasModal = true;
    }

    public function cerrarCuotas()
    {
        $this->showCuotasModal = false;
        $this->acuerdoActivoId = null;
    }

    public function abrirPago(int $cuotaId)
    {
        $this->cuotaActivaId = $cuotaId;
        $cuota = CuotaAcuerdo::find($cuotaId);
        $this->pago_fecha = now()->toDateString();
        $this->pago_monto = number_format((float) $cuota->monto_cuota, 2, '.', '');
        $this->pago_observaciones = '';
        $this->showPagoModal = true;
    }

    public function cerrarPago()
    {
        $this->showPagoModal = false;
        $this->cuotaActivaId = null;
    }

    public function registrarPago()
    {
        $this->validate([
            'pago_fecha' => 'required|date',
            'pago_monto' => 'required|numeric|min:0.01',
            'pago_observaciones' => 'nullable|string',
        ]);

        $cuota = CuotaAcuerdo::findOrFail($this->cuotaActivaId);
        $montoPagado = (float) $this->pago_monto;
        $montoCuota = (float) $cuota->monto_cuota;

        $estado = $montoPagado >= $montoCuota ? 'pagada' : 'parcial';

        $cuota->update([
            'estado' => $estado,
            'fecha_pago' => $this->pago_fecha,
            'monto_pagado' => $montoPagado,
            'observaciones' => $this->pago_observaciones ?: $cuota->observaciones,
        ]);

        // Si todas las cuotas estan pagadas, marcar acuerdo como cumplido
        $acuerdo = $cuota->acuerdo;
        $totalCuotas = $acuerdo->cuotas()->count();
        $cuotasPagadas = $acuerdo->cuotas()->where('estado', 'pagada')->count();

        if ($totalCuotas === $cuotasPagadas) {
            $acuerdo->update(['estado' => 'cumplido']);
            session()->flash('message', '¡Pago registrado! Acuerdo COMPLETADO.');
        } else {
            session()->flash('message', 'Pago de cuota #' . $cuota->numero_cuota . ' registrado.');
        }

        $this->cerrarPago();
    }

    public function anularAcuerdo(int $acuerdoId)
    {
        $acuerdo = AcuerdoPago::findOrFail($acuerdoId);
        $acuerdo->update(['estado' => 'anulado']);
        session()->flash('message', 'Acuerdo anulado.');
    }

    public function render()
    {
        $acuerdos = AcuerdoPago::with('cuotas')
            ->where('proceso_id', $this->proceso->id)
            ->orderByDesc('created_at')
            ->get();

        $acuerdoActivo = $this->acuerdoActivoId
            ? AcuerdoPago::with('cuotas')->find($this->acuerdoActivoId)
            : null;

        return view('livewire.acuerdos.acuerdos-manager', [
            'acuerdos' => $acuerdos,
            'acuerdoActivo' => $acuerdoActivo,
            'tiposAcuerdo' => AcuerdoPago::tiposAcuerdo(),
            'periodicidades' => AcuerdoPago::periodicidades(),
        ]);
    }
}
