<?php

namespace App\Models;

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

class AlgoritmoRipartizione extends Model
{
    use HasFactory;

    protected $table = 'algoritmi_ripartizione';

    protected $fillable = [
        'stabile_id',
        'tipo_consumo',
        'nome_algoritmo',
        'parametri_algoritmo',
        'quota_fissa_percentuale',
        'quota_consumo_percentuale',
        'attivo',
        'validita_da',
        'validita_a',
        'note'
    ];

    protected $casts = [
        'parametri_algoritmo' => 'array',
        'quota_fissa_percentuale' => 'decimal:2',
        'quota_consumo_percentuale' => 'decimal:2',
        'attivo' => 'boolean',
        'validita_da' => 'date',
        'validita_a' => 'date'
    ];

    /**
     * Relazione con Stabile
     */
    public function stabile()
    {
        return $this->belongsTo(Stabile::class, 'stabile_id', 'id');
    }

    /**
     * Scope per algoritmi attivi
     */
    public function scopeAttivi($query)
    {
        return $query->where('attivo', true);
    }

    /**
     * Scope per tipo consumo
     */
    public function scopePerTipo($query, $tipo)
    {
        return $query->where('tipo_consumo', $tipo);
    }

    /**
     * Scope per algoritmi validi in una data
     */
    public function scopeValidiPer($query, $data = null)
    {
        $data = $data ?: now()->toDateString();
        
        return $query->where(function($q) use ($data) {
            $q->whereNull('validita_da')
              ->orWhere('validita_da', '<=', $data);
        })->where(function($q) use ($data) {
            $q->whereNull('validita_a')
              ->orWhere('validita_a', '>=', $data);
        });
    }

    /**
     * Verifica se l'algoritmo è valido per una data
     */
    public function isValidoPer($data = null): bool
    {
        $data = $data ?: now()->toDateString();
        
        if ($this->validita_da && $this->validita_da > $data) {
            return false;
        }
        
        if ($this->validita_a && $this->validita_a < $data) {
            return false;
        }
        
        return $this->attivo;
    }

    /**
     * Calcola ripartizione per unità immobiliare
     */
    public function calcolaRipartizione($unitaImmobiliare, $costoTotale, $consumoUnita = 0, $consumoTotale = 1): array
    {
        $quotaFissa = ($costoTotale * $this->quota_fissa_percentuale / 100);
        $quotaConsumo = ($costoTotale * $this->quota_consumo_percentuale / 100);
        
        // Quota fissa: proporzionale ai millesimi di proprietà
        $millesimiProprieta = $unitaImmobiliare->millesimi_proprieta / 1000;
        $quotaFissaUnita = $quotaFissa * $millesimiProprieta;
        
        // Quota consumo: proporzionale ai consumi effettivi
        $quotaConsumoUnita = 0;
        if ($consumoTotale > 0) {
            $quotaConsumoUnita = $quotaConsumo * ($consumoUnita / $consumoTotale);
        }
        
        $totaleUnita = $quotaFissaUnita + $quotaConsumoUnita;
        
        return [
            'quota_fissa' => round($quotaFissaUnita, 2),
            'quota_consumo' => round($quotaConsumoUnita, 2),
            'totale' => round($totaleUnita, 2),
            'consumo_unita' => $consumoUnita,
            'algoritmo' => $this->nome_algoritmo
        ];
    }
}
