<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class SubentroUnita extends Model
{
    protected $table = 'subentri_unita';

    protected $fillable = [
        'unita_immobiliare_id',
        'soggetto_precedente_id',
        'soggetto_nuovo_id',
        'data_subentro',
        'tipo_subentro',
        'quota_precedente',
        'quota_nuova',
        'numero_atto',
        'data_atto',
        'notaio',
        'prezzo_vendita',
        'stato_subentro',
        'data_completamento',
        'ripartizioni_aggiornate',
        'comunicazioni_inviate',
        'note',
        'allegati',
        'created_by'
    ];

    protected $casts = [
        'data_subentro' => 'date',
        'data_atto' => 'date',
        'data_completamento' => 'datetime',
        'quota_precedente' => 'decimal:4',
        'quota_nuova' => 'decimal:4',
        'prezzo_vendita' => 'decimal:2',
        'ripartizioni_aggiornate' => 'boolean',
        'comunicazioni_inviate' => 'boolean',
        'allegati' => 'array'
    ];

    // === RELAZIONI ===

    public function unitaImmobiliare(): BelongsTo
    {
        return $this->belongsTo(UnitaImmobiliare::class);
    }

    public function soggettoPrecedente(): BelongsTo
    {
        return $this->belongsTo(Soggetto::class, 'soggetto_precedente_id');
    }

    public function soggettoNuovo(): BelongsTo
    {
        return $this->belongsTo(Soggetto::class, 'soggetto_nuovo_id');
    }

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

    // === METODI UTILITÀ ===

    public function getStatoBadgeColor(): string
    {
        return match($this->stato_subentro) {
            'proposto' => 'warning',
            'in_corso' => 'info',
            'completato' => 'success',
            'annullato' => 'danger',
            default => 'secondary'
        };
    }

    public function getTipoSubentroBadgeColor(): string
    {
        return match($this->tipo_subentro) {
            'vendita' => 'primary',
            'eredita' => 'success',
            'donazione' => 'info',
            'locazione' => 'warning',
            'comodato' => 'secondary',
            default => 'dark'
        };
    }

    public function getTipoSubentroIcon(): string
    {
        return match($this->tipo_subentro) {
            'vendita' => 'fas fa-euro-sign',
            'eredita' => 'fas fa-gift',
            'donazione' => 'fas fa-heart',
            'locazione' => 'fas fa-key',
            'comodato' => 'fas fa-handshake',
            default => 'fas fa-exchange-alt'
        };
    }

    public function isPending(): bool
    {
        return in_array($this->stato_subentro, ['proposto', 'in_corso']);
    }

    public function isCompletato(): bool
    {
        return $this->stato_subentro === 'completato';
    }

    public function calcolaTempistiche(): array
    {
        $now = now();
        $dataSubentro = $this->data_subentro;
        
        if ($this->isCompletato()) {
            $tempoCompletamento = $this->data_completamento->diffInDays($this->created_at);
            return [
                'stato' => 'completato',
                'giorni_completamento' => $tempoCompletamento,
                'in_tempo' => $tempoCompletamento <= 30
            ];
        }

        $giorniTrascorsi = $this->created_at->diffInDays($now);
        $giorniAlSubentro = $now->diffInDays($dataSubentro, false);
        
        return [
            'stato' => 'in_corso',
            'giorni_trascorsi' => $giorniTrascorsi,
            'giorni_al_subentro' => $giorniAlSubentro,
            'urgente' => $giorniAlSubentro <= 7 && $giorniAlSubentro > 0,
            'scaduto' => $giorniAlSubentro < 0
        ];
    }

    // === SCOPES ===

    public function scopePending($query)
    {
        return $query->whereIn('stato_subentro', ['proposto', 'in_corso']);
    }

    public function scopeCompletati($query)
    {
        return $query->where('stato_subentro', 'completato');
    }

    public function scopeDelPeriodo($query, $dataInizio, $dataFine)
    {
        return $query->whereBetween('data_subentro', [$dataInizio, $dataFine]);
    }

    public function scopePerTipo($query, string $tipo)
    {
        return $query->where('tipo_subentro', $tipo);
    }
}
