<?php

namespace App\Services\Carrello;

use App\Models\Ordine;
use App\Models\RigaOrdine;
use App\Models\Piatto;
use App\Models\VariantePiatto;
use App\Models\RigaOrdineHasVariante;
use Illuminate\Database\Eloquent\ModelNotFoundException;

class CarrelloService
{
    public function findCartOrFail(int $ordineId): Ordine
    {
        $ordine = Ordine::find($ordineId);

        if (! $ordine) {
            throw new ModelNotFoundException('Ordine non trovato.');
        }

        return $ordine;
    }

    public function aumentaQuantita(int $dispositivo_id ,?int $attivita_id, ?int $ordine_id, int $piatto_id, ?int $riga_ordine_id = null): array
    {
    // Tolleranza su ordine_id stale: se non e` valido, usa/crea il carrello corrente per dispositivo+attivita.
        $carrelloBaseQuery = Ordine::query()
            ->where('stato', Ordine::CARRELLO)
            ->where('dispositivo_id', $dispositivo_id)
            ->when(
                $attivita_id,
                fn ($q) => $q->where('attivita_id', $attivita_id)
            );

        $carrello = null;
        if ($ordine_id) {
            $carrello = (clone $carrelloBaseQuery)
                ->whereKey($ordine_id)
                ->first();
        }

        if (!$carrello) {
            $carrello = (clone $carrelloBaseQuery)->latest('id')->first();
        }

        if (!$carrello) {
            $carrello = Ordine::create([
                'stato' => Ordine::CARRELLO,
                'dispositivo_id' => $dispositivo_id,
                'attivita_id' => $attivita_id,
            ]);
        }

        if($riga_ordine_id){
            $riga = RigaOrdine::findOrFail($riga_ordine_id);
        }else{
            $riga = RigaOrdine::where('ordine_id', $carrello->id)->where('piatto_id', $piatto_id)->whereDoesntHave('has_variante')->oldest('id')->first();
        }
        // else{
        //     $riga = RigaOrdine::where('ordine_id', $carrello->id)->where('piatto_id', $piatto_id)->first();
        // }

        // $piatto = Piatto::findOrFail($piatto_id);

        
        if($riga){
            $piatto = $riga->piatto;
            if($piatto == null){
                return [
                    'success' => false,
                    'message' => 'Piatto non trovato.',
                    'data' => null,
                ];
            }

            $riga->quantita += 1;
            $riga->prezzo = $this->calcolaPrezzoRiga($riga);
            $riga->save();
        }else{
            $riga = RigaOrdine::create([
                'ordine_id' => $carrello->id,
                'piatto_id' => $piatto_id,
                'quantita' => 1,
                // 'prezzo' => $piatto->prezzo,
            ]);
            $riga->prezzo = $this->calcolaPrezzoRiga($riga);
            $riga->save();
        }
        // dd($riga);
        return [
            'ordine' => $riga->ordine,
            'riga' => $riga,
        ];
    }

    public function diminuisciQuantita(int $ordine_id, int $piatto_id, int $riga_ordine_id): array
    {
        $carrello = Ordine::findOrFail($ordine_id);
        // $riga = RigaOrdine::where('ordine_id', $carrello->id)->where('piatto_id', $piatto_id)->first();
        $riga = RigaOrdine::findOrFail($riga_ordine_id);
        if($riga && $riga->id == $riga_ordine_id){
            // $piatto = Piatto::findOrFail($piatto_id);
            $piatto = $riga->piatto;
            $riga->quantita -= 1;

            if($riga->quantita == 0){
                $riga->delete();
                return [
                    'ordine' => $carrello,
                    'riga' => null,
                ];
            };

            $riga->prezzo = $this->calcolaPrezzoRiga($riga);
            $riga->save();   
        }
        return [
            'ordine' => $carrello,
            'riga' => $riga,
        ];
    }

    public function eliminaRiga(int $rigaOrdineId, bool $elimina = false): void
    {
        $riga = RigaOrdine::find($rigaOrdineId);
        if($riga !== null && $elimina){
        $riga->delete();
        };
    }

    public function azzeraCarrello(int $ordine_id): array
    {
        $ordine = Ordine::find($ordine_id);

        if($ordine == null){
            return [
                'success' => false,
                'message' => 'Ordine non trovato',
                'data' => null,  
            ];
        }
        $righe = RigaOrdine::where('ordine_id', $ordine->id)->delete();
        $ordine->prezzo = 0;
        $ordine->save();
        $ordine->delete();

        return [
            'success' => true,
            'message' => 'Carrello svuotato',
            'data' => null,
        ];
        // switch(Dispositivo::cassa()->first()->tipo){
        //     case Dispositivo::CASSA:
        //         return redirect()->route('punto-vendita.show');
        //         break;
        //     case Dispositivo::TIPO_KIOSK:
        //         // return redirect()->route('punto_vendita.kiosk.index');
        //         return redirect()->route('punto-vendita.show');

        //         break;
        //     case Dispositivo::CAMERIERE:
        //         // return redirect()->route('punto_vendita.cameriere.index');
        //         return redirect()->route('punto-vendita.show');
                
        //         break;
        // }
    }

    public function aggiornaNota(int $rigaOrdineId, string $note = null): RigaOrdine
    {
        $riga = RigaOrdine::findOrFail($rigaOrdineId);
        if($riga == null){
            throw new ModelNotFoundException('Riga ordine non trovata.');
        };

        $riga->note = $note;
        $riga->save();
        return $riga;
    }

    public function aggiungiVarianteSingoloPiatto(int $piattoId, int $rigaOrdineId, int $varianteId, string $nota = null): array
    {
        $riga = RigaOrdine::findOrFail($rigaOrdineId);
        if($riga == null){
            return [
                'success' => false,
                'message' => 'Riga ordine non trovata.',
                'data' => null,
            ];
        }
        $variante = VariantePiatto::findOrFail($varianteId);
        if($variante == null){
            return [
                'success' => false,
                'message' => 'Variante non trovata.',
                'data' => null,
            ];
        }
        $piatto = Piatto::findOrFail($piattoId);
        if($piatto == null){
            return [
                'success' => false,
                'message' => 'Piatto non trovato.',
                'data' => null,
            ];
        }

        if($riga->quantita == 1){
            $pivotVariante = RigaOrdineHasVariante::create([
                'riga_ordine_id' => $riga->id,
                'variante_id' => $varianteId,
                // 'nota' => $nota,
            ]);

            $riga->prezzo = $this->calcolaPrezzoRiga($riga);
            $riga->save();
            return [
                'success' => true,
                'message' => 'Variante aggiunta al piatto',
                'data' => $pivotVariante,
            ];
        }

        $NuovaRigaPerVariante = RigaOrdine::create([
            'ordine_id' => $riga->ordine_id,
            'piatto_id' => $piattoId,
            'quantita' => 1,
            'prezzo' => $piatto->prezzo,
            'note' => $nota,
        ]);

        $pivotVariante = RigaOrdineHasVariante::create([
            'riga_ordine_id' => $NuovaRigaPerVariante->id,
            'variante_id' => $varianteId,
            // 'nota' => $nota,
        ]);

        $riga->quantita -= 1;
        $riga->prezzo = $this->calcolaPrezzoRiga($riga);
        $riga->save();

        $NuovaRigaPerVariante->prezzo = $this->calcolaPrezzoRiga($NuovaRigaPerVariante);
        $NuovaRigaPerVariante->save();
        // dd($NuovaRigaPerVariante ,$riga, $pivotVariante);
        return [
            'success' => true,
            'message' => 'Variante aggiornata',
            'data' => $NuovaRigaPerVariante,
        ];
    }

  

    public function eliminaVariante(int $rigaOrdineId, int $varianteId): array
    {
        $riga = RigaOrdine::findOrFail($rigaOrdineId);
        if($riga == null){
            return [
                'success' => false,
                'message' => 'Riga ordine non trovata.',
                'data' => null,
            ];
        }
        $variante = VariantePiatto::findOrFail($varianteId);
        if($variante == null){
            return [
                'success' => false,
                'message' => 'Variante non trovata.',
                'data' => null,
            ];
        }
        $pivotVariante = RigaOrdineHasVariante::where('riga_ordine_id', $riga->id)->where('variante_id', $varianteId)->first();
        if($pivotVariante == null){
            return [
                'success' => false,
                'message' => 'Variante non trovata.',
                'data' => null,
            ];
        }
        $pivotVariante->delete();
        
        $riga->prezzo = $this->calcolaPrezzoRiga($riga);
        $riga->save();  
            
        return [
            'success' => true,
            'message' => 'Variante eliminata',
            'data' => null,
        ];
    }

    private function calcolaPrezzoRiga(RigaOrdine $riga): float
    {
        $parziale = $riga->piatto->prezzo*$riga->quantita;

        if($riga->has_variante->isNotEmpty()){
            foreach($riga->has_variante as $variante){
                if($variante != null && 
                $variante->variante_piatto != null && 
                $variante->variante_piatto->prezzo != null && 
                $variante->variante_piatto->prezzo != 0){
                    $parziale += $variante->variante_piatto->prezzo * $riga->quantita;
                }
            }
        }
        return $parziale;
    }

      // public function aggiungiVarianteTuttiPiatto(int $piattoId, int $rigaOrdineId, int $varianteId, string $nota): array
    // {
    //     $riga = RigaOrdine::find($rigaOrdineId);
    //     if (!$riga) {
    //         return [
    //             'success' => false,
    //             'message' => 'Riga ordine non trovata.',
    //             'data' => null,
    //         ];
    //     }

    //     $piatto = Piatto::find($piattoId);
    //     if (!$piatto) {
    //         return [
    //             'success' => false,
    //             'message' => 'Piatto non trovato.',
    //             'data' => null,
    //         ];
    //     }

    //     $quantitaOriginale = $riga->quantita;

    //     if ($quantitaOriginale <= 1) {
    //         // Non c'è niente da splittare, quindi niente copie da fare
    //         return [
    //             'success' => false,
    //             'message' => 'Non ci sono abbastanza piatti per dividere in varianti.',
    //             'data' => null,
    //         ];
    //     }

    //     for ($i = 1; $i < $quantitaOriginale; $i++) {
    //         RigaOrdine::create([
    //             'ordine_id' => $riga->ordine_id,
    //             'piatto_id' => $piattoId,
    //             'quantita' => 1,
    //             'prezzo' => $piatto->prezzo,
    //         ]);
    //     }
    //     $riga->quantita = 1;
    //     $riga->save();

    //     return [
    //         'success' => true,
    //         'message' => 'Riga ordine per variante aggiunta per tutti i piatti',
    //         'data' => null,
    //     ];
    // }
}