<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

class AcuerdoPago extends Model
{
    use HasFactory, SoftDeletes;

    protected $table = 'acuerdos_pago';

    protected $fillable = [
        'proceso_id',
        'user_id',
        'tipo_acuerdo',
        'etapa_caso',
        'fecha_firma',
        'monto_acordado',
        'numero_cuotas',
        'valor_cuota',
        'fecha_primera_cuota',
        'periodicidad',
        'numero_radicado',
        'juzgado',
        'fecha_audiencia_conciliacion',
        'fue_homologado',
        'fecha_homologacion',
        'estado',
        'observaciones',
    ];

    protected $casts = [
        'fecha_firma' => 'date',
        'fecha_primera_cuota' => 'date',
        'fecha_audiencia_conciliacion' => 'date',
        'fecha_homologacion' => 'date',
        'monto_acordado' => 'decimal:2',
        'valor_cuota' => 'decimal:2',
        'fue_homologado' => 'boolean',
    ];

    // ----- Relaciones -----
    public function proceso(): BelongsTo
    {
        return $this->belongsTo(Proceso::class, 'proceso_id');
    }

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class, 'user_id');
    }

    public function cuotas(): HasMany
    {
        return $this->hasMany(CuotaAcuerdo::class, 'acuerdo_id')
                    ->orderBy('numero_cuota');
    }

    // ----- Labels para UI -----
    public static function tiposAcuerdo(): array
    {
        return [
            'extrajudicial_privado' => 'Extrajudicial - Privado',
            'extrajudicial_notariado' => 'Extrajudicial - Notariado',
            'conciliacion_extrajudicial' => 'Conciliación Extrajudicial',
            'conciliacion_judicial' => 'Conciliación Judicial',
        ];
    }

    public static function periodicidades(): array
    {
        return [
            'semanal' => 'Semanal',
            'quincenal' => 'Quincenal',
            'mensual' => 'Mensual',
        ];
    }

    public static function estados(): array
    {
        return [
            'vigente' => 'Vigente',
            'cumplido' => 'Cumplido',
            'incumplido' => 'Incumplido',
            'anulado' => 'Anulado',
        ];
    }

    public function getTipoAcuerdoLabelAttribute(): string
    {
        return self::tiposAcuerdo()[$this->tipo_acuerdo] ?? $this->tipo_acuerdo;
    }

    public function getEstadoLabelAttribute(): string
    {
        return self::estados()[$this->estado] ?? $this->estado;
    }

    public function getEstadoColorAttribute(): string
    {
        return match ($this->estado) {
            'vigente' => 'bg-blue-100 text-blue-800',
            'cumplido' => 'bg-green-100 text-green-800',
            'incumplido' => 'bg-red-100 text-red-800',
            'anulado' => 'bg-gray-100 text-gray-800',
            default => 'bg-gray-100 text-gray-800',
        };
    }

    // ----- Calculos -----
    public function getTotalPagadoAttribute(): float
    {
        return (float) $this->cuotas()
                            ->whereIn('estado', ['pagada', 'parcial'])
                            ->sum('monto_pagado');
    }

    public function getSaldoPendienteAttribute(): float
    {
        return (float) $this->monto_acordado - $this->total_pagado;
    }

    public function getCuotasPagadasCountAttribute(): int
    {
        return $this->cuotas()->where('estado', 'pagada')->count();
    }

    public function getCuotasVencidasCountAttribute(): int
    {
        return $this->cuotas()
                    ->where('estado', 'pendiente')
                    ->where('fecha_vencimiento', '<', now()->toDateString())
                    ->count();
    }
}
