<?php

namespace App\Models;

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

class ComposizioneUnita extends Model
{
    protected $table = 'composizione_unita';

    protected $fillable = [
        'unita_originale_id',
        'unita_risultante_id',
        'tipo_operazione',
        'data_operazione',
        'superficie_trasferita',
        'millesimi_trasferiti',
        'vani_trasferiti',
        'millesimi_automatici',
        'coefficiente_ripartizione',
        'numero_pratica',
        'riferimento_catastale',
        'note_variazione',
        'stato_pratica',
        'data_approvazione',
        'created_by'
    ];

    protected $casts = [
        'data_operazione' => 'date',
        'data_approvazione' => 'date',
        'superficie_trasferita' => 'decimal:2',
        'millesimi_trasferiti' => 'decimal:4',
        'millesimi_automatici' => 'boolean',
        'coefficiente_ripartizione' => 'decimal:4'
    ];

    // === RELAZIONI ===

    public function unitaOriginale(): BelongsTo
    {
        return $this->belongsTo(UnitaImmobiliare::class, 'unita_originale_id');
    }

    public function unitaRisultante(): BelongsTo
    {
        return $this->belongsTo(UnitaImmobiliare::class, 'unita_risultante_id');
    }

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

    // === METODI UTILITÀ ===

    public function getStatoBadgeColor(): string
    {
        return match($this->stato_pratica) {
            'in_corso' => 'warning',
            'approvata' => 'info',
            'completata' => 'success',
            'respinta' => 'danger',
            default => 'secondary'
        };
    }

    public function getTipoOperazioneIcon(): string
    {
        return match($this->tipo_operazione) {
            'unione' => 'fas fa-compress-arrows-alt',
            'divisione' => 'fas fa-expand-arrows-alt',
            'modifica' => 'fas fa-edit',
            default => 'fas fa-puzzle-piece'
        };
    }

    public function getTipoOperazioneBadgeColor(): string
    {
        return match($this->tipo_operazione) {
            'unione' => 'primary',
            'divisione' => 'info',
            'modifica' => 'warning',
            default => 'secondary'
        };
    }

    public function isNuovaComposizione(): bool
    {
        return $this->unita_originale_id === null;
    }

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

    public function isCompletata(): bool
    {
        return $this->stato_pratica === 'completata';
    }

    public function calcolaImpatto(): array
    {
        $impatto = [
            'superficie_percentuale' => 0,
            'millesimi_percentuale' => 0,
            'vani_percentuale' => 0
        ];

        if ($this->unitaRisultante) {
            $superficieTotale = $this->unitaRisultante->superficie_commerciale;
            $millesimiTotali = $this->unitaRisultante->millesimi_proprieta;
            $vaniTotali = $this->unitaRisultante->numero_vani;

            if ($superficieTotale > 0 && $this->superficie_trasferita) {
                $impatto['superficie_percentuale'] = round(($this->superficie_trasferita / $superficieTotale) * 100, 2);
            }

            if ($millesimiTotali > 0 && $this->millesimi_trasferiti) {
                $impatto['millesimi_percentuale'] = round(($this->millesimi_trasferiti / $millesimiTotali) * 100, 2);
            }

            if ($vaniTotali > 0 && $this->vani_trasferiti) {
                $impatto['vani_percentuale'] = round(($this->vani_trasferiti / $vaniTotali) * 100, 2);
            }
        }

        return $impatto;
    }

    public function calcolaCostiOperazione(): array
    {
        $costiBase = [
            'unione' => 500,
            'divisione' => 800,
            'modifica' => 300
        ];

        $costoBase = $costiBase[$this->tipo_operazione] ?? 400;
        $costoSuperficie = ($this->superficie_trasferita ?? 0) * 5; // €5 per m²
        $costoVani = ($this->vani_trasferiti ?? 0) * 100; // €100 per vano

        return [
            'costo_base' => $costoBase,
            'costo_superficie' => $costoSuperficie,
            'costo_vani' => $costoVani,
            'costo_totale_stimato' => $costoBase + $costoSuperficie + $costoVani
        ];
    }

    // === SCOPES ===

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

    public function scopeCompletate($query)
    {
        return $query->where('stato_pratica', 'completata');
    }

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

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

    public function scopeNuoveComposizioni($query)
    {
        return $query->whereNull('unita_originale_id');
    }
}
