<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

/**
 * Class DettaglioRipartizioneSpese
 * 
 * Gestisce i dettagli della ripartizione spese per ogni unità immobiliare
 * 
 * @package App\Models
 */
class DettaglioRipartizioneSpese extends Model
{
    use HasFactory;

    protected $table = 'dettaglio_ripartizione_spese';

    protected $fillable = [
        'ripartizione_spese_id',
        'unita_immobiliare_id',
        'anagrafica_condominiale_id',
        'millesimi_applicati',
        'percentuale_applicata',
        'quota_calcolata',
        'quota_personalizzata',
        'quota_finale',
        'esente',
        'motivo_esenzione',
        'note_dettaglio',
        'tipo_soggetto',
        'percentuale_inquilino',
        'importo_inquilino',
        'importo_proprietario'
    ];

    protected $casts = [
        'millesimi_applicati' => 'decimal:3',
        'percentuale_applicata' => 'decimal:2',
        'quota_calcolata' => 'decimal:2',
        'quota_personalizzata' => 'decimal:2',
        'quota_finale' => 'decimal:2',
        'percentuale_inquilino' => 'decimal:2',
        'importo_inquilino' => 'decimal:2',
        'importo_proprietario' => 'decimal:2',
        'esente' => 'boolean'
    ];

    /**
     * Relazione con RipartizioneSpese
     */
    public function ripartizioneSpese()
    {
        return $this->belongsTo(RipartizioneSpese::class);
    }

    /**
     * Relazione con UnitaImmobiliare
     */
    public function unitaImmobiliare()
    {
        return $this->belongsTo(UnitaImmobiliare::class);
    }

    /**
     * Relazione con AnagraficaCondominiale
     */
    public function anagraficaCondominiale()
    {
        return $this->belongsTo(AnagraficaCondominiale::class);
    }

    /**
     * Scope per dettagli non esenti
     */
    public function scopeNonEsenti($query)
    {
        return $query->where('esente', false);
    }

    /**
     * Scope per dettagli esenti
     */
    public function scopeEsenti($query)
    {
        return $query->where('esente', true);
    }

    /**
     * Scope per tipo soggetto
     */
    public function scopePerTipoSoggetto($query, $tipo)
    {
        return $query->where('tipo_soggetto', $tipo);
    }

    /**
     * Metodo per calcolare la quota finale
     */
    public function calcolaQuotaFinale()
    {
        if ($this->esente) {
            $this->quota_finale = 0;
        } else {
            $this->quota_finale = $this->quota_personalizzata ?? $this->quota_calcolata;
        }

        $this->save();
        return $this;
    }

    /**
     * Metodo per applicare esenzione
     */
    public function applicaEsenzione($motivo = null)
    {
        $this->update([
            'esente' => true,
            'motivo_esenzione' => $motivo,
            'quota_finale' => 0,
            'importo_inquilino' => 0,
            'importo_proprietario' => 0
        ]);

        return $this;
    }

    /**
     * Metodo per rimuovere esenzione
     */
    public function rimuoviEsenzione()
    {
        $this->update([
            'esente' => false,
            'motivo_esenzione' => null
        ]);

        $this->calcolaQuotaFinale();
        return $this;
    }

    /**
     * Metodo per personalizzare la quota
     */
    public function personalizzaQuota($nuovaQuota, $motivo = null)
    {
        $this->update([
            'quota_personalizzata' => $nuovaQuota,
            'note_dettaglio' => $motivo
        ]);

        $this->calcolaQuotaFinale();
        return $this;
    }

    /**
     * Metodo per calcolare ripartizione inquilino/proprietario
     */
    public function calcolaRipartizioneInquilinoProprietario()
    {
        if ($this->percentuale_inquilino > 0) {
            $this->importo_inquilino = $this->quota_finale * ($this->percentuale_inquilino / 100);
            $this->importo_proprietario = $this->quota_finale - $this->importo_inquilino;
        } else {
            $this->importo_inquilino = 0;
            $this->importo_proprietario = $this->quota_finale;
        }

        $this->save();
        return $this;
    }

    /**
     * Verifica se la quota è stata personalizzata
     */
    public function isPersonalizzata()
    {
        return !is_null($this->quota_personalizzata);
    }

    /**
     * Ottieni la differenza tra quota calcolata e personalizzata
     */
    public function getDifferenzaQuote()
    {
        if (!$this->isPersonalizzata()) {
            return 0;
        }

        return $this->quota_personalizzata - $this->quota_calcolata;
    }

    /**
     * Accessor per tipo soggetto formattato
     */
    public function getTipoSoggettoFormattatoAttribute()
    {
        return match ($this->tipo_soggetto) {
            'proprietario' => 'Proprietario',
            'inquilino' => 'Inquilino',
            'usufruttuario' => 'Usufruttuario',
            'altro' => 'Altro',
            default => ucfirst($this->tipo_soggetto)
        };
    }

    /**
     * Accessor per percentuale millesimi
     */
    public function getPercentualeMillesimiAttribute()
    {
        if ($this->millesimi_applicati) {
            return ($this->millesimi_applicati / 1000) * 100;
        }
        return 0;
    }

    /**
     * Accessor per stato esenzione formattato
     */
    public function getStatoEsenzioneAttribute()
    {
        return $this->esente ? 'Esente' : 'Non Esente';
    }
}
