<?php

namespace App\Services\Fattura;

use App\Models\User;
use App\Models\RigaFatturazione;
use App\Models\Fattura;
use App\Models\Attivita;

class GeneraFatturaMensile
{

    public function needFatturazione()
    {
        //carico organizzazioni
        $organizzazioni = User::whereRelation('roles', 'name', 'amministratore')->get();

        //se hanno riga_fatturazione pendenti, genero fattura mensile
        foreach($organizzazioni as $organizzazione) {

            $attivitaOrganizzazione = Attivita::where('user_id', $organizzazione->id)->get();

                foreach($attivitaOrganizzazione as $attivita) {
                    if($this->checkNeedFatturazione($attivita)) {
                        $this->generaFatturaMensile($attivita->user);
                    }
                }
        }
    }

    public function checkNeedFatturazione(Attivita $attivita)
    {
        $riga_fatturazione = RigaFatturazione::where('attivita_id', $attivita->id)
        ->where('stato', RigaFatturazione::REGISTRATO)
        ->count();

        return $riga_fatturazione > 0 ? true : false;
    }

    public function generaFatturaMensile(User $organizzazione)
    {
        $fattura = new Fattura();
        $fattura->user_id = $organizzazione->id;
        $fattura->numero_fattura = $this->generaNumeroFattura($organizzazione);
        $fattura->data_fattura = now();
        $fattura->stato = Fattura::IN_ELABORAZIONE;
        $fattura->note = 'Fattura mensile generata per l\'organizzazione ' . $organizzazione->fullName();
        $fattura->save();

        $righe_fatturazione = $this->getRigheFatturazionePendenti($organizzazione);
        $fattura->totale_netto = $righe_fatturazione->sum('prezzo');
        $fattura->totale_imponibile = $fattura->totale_netto * 1.22;
        $fattura->save();
       foreach($righe_fatturazione as $riga_fatturazione) {
        $riga_fatturazione->update([
            'fattura_id' => $fattura->id,
            'stato' => RigaFatturazione::FATTURATO
        ]);
       }
       $fattura->update(['stato' => Fattura::EMESSA]);
       return ;
    }

    private static function generaNumeroFattura()
    {
        $ultimaFattura = Fattura::orderBy('id', 'desc')->first();
        if($ultimaFattura) {
            return $ultimaFattura->numero_fattura + 1;
        } else {
            return 1;
        }
    }

    private static function getRigheFatturazionePendenti(User $organizzazione)
    {
        $attivitaOrganizzazione = Attivita::where('user_id', $organizzazione->id)->pluck('id');
        return RigaFatturazione::whereIn('attivita_id', $attivitaOrganizzazione)->where('stato', RigaFatturazione::REGISTRATO)->get();
    }
}