<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Attivita;
use App\Models\Cucina;
use App\Models\Piatto;
use App\Models\Saltacoda;
use App\Models\SaltacodaOrdine;
use App\Models\SaltacodaRigaordine;
use Illuminate\Support\Str;

use Illuminate\Support\Facades\Auth;


class SaltacodaController extends Controller
{
    public static $permission_group = "Saltacoda";
    public static $permissions = [
        'view-saltacoda' => 'Vedi',
        'create-saltacoda' => 'Crea',
        'edit-saltacoda' => 'Modifica',
        'delete-saltacoda' => 'Elimina',
    ];

    public static function middleware(): array
    {
        return [
            new Middleware('permission:view-saltacoda', only: ['index']),
            new Middleware('permission:create-saltacoda|edit-saltacoda|delete-saltacoda', only: ['store', 'update', 'destroy']),
        ];
    }

    public function index(Request $request)
    {
        $attivita = Attivita::find(session()->get('attivita_attuale'));
        if(!$attivita) {
            return redirect()->route('dashboard')->with('error', 'Attività non trovata');
        }
        $saltacoda = Saltacoda::where('attivita_id', $attivita->id)->first();
        
        if(!$saltacoda) {
            return view('saltacoda.index', ['attivita' => $attivita]);
        }
        return view('saltacoda.index', compact('attivita', 'saltacoda'));
    }

    public function attiva(Request $request)
    {
        $attivita = Attivita::find(session()->get('attivita_attuale'));
        if(!$attivita) {
            return redirect()->route('dashboard')->with('error', 'Attività non trovata');
        }
        $saltacoda = Saltacoda::where('attivita_id', $attivita->id)->first();
        if(!$saltacoda) {
            $saltacoda = Saltacoda::create([
                'attivita_id' => $attivita->id,
                'is_attivo' => true,
            ]);
    }else{
        $saltacoda->is_attivo = true;
        $saltacoda->save();
    }
        return redirect()->route('saltacoda.index')->with('success', 'Saltacoda abilitato');
    }

    public function store(Request $request)
    {
        // dd($request->all());
        $request->validate([
            'attivita_id' => 'required|exists:attivita,id',
            'is_attivo' => 'required|boolean',
            'max_ordini' => 'nullable|integer|min:0',
            'info' => 'nullable|json',
            'note' => 'nullable|array',
            'note.*.label' => 'required_with:note|string|max:255',
            'note.*.value' => 'nullable|string|max:5000',
        ]);

        $noteJson = collect($request->input('note', []))
            ->map(fn (array $row) => [
                'label' => trim((string) ($row['label'] ?? '')),
                'value' => trim((string) ($row['value'] ?? '')),
            ])
            ->filter(fn (array $row) => $row['label'] !== '')
            ->values()
            ->all();

        $saltacoda = Saltacoda::updateOrCreate(
            ['attivita_id' => $request->attivita_id],
            [
                'is_attivo' => $request->is_attivo,
                'max_ordini' => $request->max_ordini,
                'info' => $request->info,
                'note' => $noteJson !== [] ? json_encode($noteJson, JSON_UNESCAPED_UNICODE) : null,
            ]
        );
        return redirect()->route('saltacoda.index')->with('success', 'Saltacoda salvato');
    }

    public function show(Request $request)
    {
        $attivita = Attivita::find($request->get('attivita_id'));
        if(!$attivita) {
            return response()->json([
                'success' => false,
                'message' => 'Attività non trovata'
            ]);
        }
        
        $saltacoda = Saltacoda::where('attivita_id', $attivita->id)
        ->where('is_attivo', true)
        ->first();
        if(!$saltacoda) {
            return abort(404);
        }


        $cucine = Cucina::query()
                ->where('attivita_id', $attivita->id)
                ->where('is_attiva', true)
                ->with(['piatti' => function ($q) use ($attivita) {
                    $q->where('attivita_id', $attivita->id)
                    ->where('is_attivo', true);
                }])
                ->get();

        $campiInfo = [];
        $rawInfo = $saltacoda->info;
        if (is_string($rawInfo) && $rawInfo !== '') {
            $decoded = json_decode($rawInfo, true);
            if (is_array($decoded)) {
                foreach ($decoded as $key => $value) {
                    if (is_string($value)) {
                        $campiInfo[] = [
                            'key' => (string) $key,
                            'label' => $value,
                            'type' => 'text',
                            'required' => false,
                        ];
                        continue;
                    }

                    if (is_array($value)) {
                        $type = $value['type'] ?? 'text';
                        if (!in_array($type, ['text', 'boolean', 'time'], true)) {
                            $type = 'text';
                        }

                        $campiInfo[] = [
                            'key' => (string) $key,
                            'label' => (string) ($value['label'] ?? $key),
                            'type' => $type,
                            'required' => (bool) ($value['required'] ?? false),
                        ];
                    }
                }
            }
        }

        return view('saltacoda.show', [
            'attivita' => $attivita,
            'cucine' => $cucine,
            'campi_info' => $campiInfo,
            'saltacoda_id' => $saltacoda->id,
        ]);
    }

    public function pre_ordine_salva(Request $request)
    {
        $request->validate([
            'saltacoda_id' => 'required|exists:saltacoda,id',
            'attivita_id' => 'required|exists:attivita,id',
            'riga_ordine' => 'required|array|min:1',
            'riga_ordine.*.piatto_id' => 'required|exists:piatto,id',
            'riga_ordine.*.qta' => 'required|integer|min:1',
            'riga_ordine.*.note' => 'nullable|string|max:500',
            'info_cliente' => 'nullable|array',
            'idempotency_key' => 'nullable|string|max:120',
        ]);

        $saltacoda = Saltacoda::where('id', $request->saltacoda_id)
            ->where('attivita_id', $request->attivita_id)
            ->first();
        if (!$saltacoda) {
            return response()->json([
                'success' => false,
                'message' => 'Saltacoda non valida per questa attività.'
            ], 422);
        }

// dd($request->all());

        //Ordine Saltacoda
        $saltacoda_ordine = SaltacodaOrdine::updateOrCreate(
            ['riferimento' => $request->idempotency_key],
            [
                'riferimento' => $request->idempotency_key,
                'attivita_id' => $request->attivita_id,
                'info' => $request->info_cliente,
                'prenotazione_id' => null,
                'stato' => SaltacodaOrdine::PRE_ORDINE,
                'pagamento_id' => null,
                'attivita_id' => $request->attivita_id,
                'note' => null,
                'codice' => "PRE_".strtoupper(Str::random(5)),
                'tipo' => null,
                'prezzo' => 0,
                'metodo_pagamento_id' => null,
                'info' => $request->info_cliente,
            ]);

            //Riga Ordine Saltacoda
            foreach ($request->riga_ordine as $riga) {
                SaltacodaRigaordine::create([
                    'saltacoda_ordine_id' => $saltacoda_ordine->id,
                    'piatto_id' => $riga['piatto_id'],
                    'quantita' => $riga['qta'],
                    'note' => $riga['note'],
                    'prezzo' => (Piatto::find($riga['piatto_id'])->prezzo*$riga['qta']),
                ]);
            }

            //Aggiorna prezzo totale ordine
            $saltacoda_ordine->prezzo = $saltacoda_ordine->riga_ordine->sum('prezzo');
            $saltacoda_ordine->save();

            // dd($saltacoda_ordine);
            return response()->json([
                'success' => true,
                'message' => 'Pre-ordine salvato',
                'data' => $saltacoda_ordine,
            ]);


    }

    public function pre_ordine_show(Request $request)
    {
        $saltacoda_ordine = SaltacodaOrdine::where('codice', $request->get('codice'))->first();
        if(!$saltacoda_ordine) {
            return abort(404);
        }
        return view('saltacoda.pre_ordine', ['saltacoda_ordine' => $saltacoda_ordine]);
    }
}
