<?php

namespace App\Services\Carrello;

use App\Models\Ordine;
use App\Models\RigaOrdine;
use App\Models\Piatto;
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): 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,
            ]);
        }

        $riga = RigaOrdine::where('ordine_id', $carrello->id)->where('piatto_id', $piatto_id)->first();
        $piatto = Piatto::findOrFail($piatto_id);
        if($riga){
            $riga->quantita += 1;
            $riga->prezzo = $piatto->prezzo*$riga->quantita;
            $riga->save();
        }else{
            $riga = RigaOrdine::create([
                'ordine_id' => $carrello->id,
                'piatto_id' => $piatto_id,
                'quantita' => 1,
                'prezzo' => $piatto->prezzo,
            ]);
        }
        // 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();
        if($riga && $riga->id == $riga_ordine_id){
            $piatto = Piatto::findOrFail($piatto_id);
            $riga->quantita -= 1;
            $riga->prezzo = $piatto->prezzo*$riga->quantita;
            $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): RigaOrdine
    {
        $riga = RigaOrdine::findOrFail($rigaOrdineId);
        if($riga == null){
            throw new ModelNotFoundException('Riga ordine non trovata.');
        };
        if($note == null){
            throw new ValidationException('Nota non valida.');
        }
        $riga->note = $note;
        $riga->save();
        return $riga;
    }
}