<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\PrenotazioneTavolo;
use App\DataTables\PrenotazioneTavoloDataTable;
use App\DataTables\PrenotazioneTavoloDataTableEditor;
use Illuminate\Support\Facades\Auth;
use App\Models\Attivita;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Session;

class PrenotazioneTavoloController extends Controller
{
    public static $permission_group = "Prenotazioni";
    public static $permissions = [
        'view-prenotazione_tavolo' => 'Vedi',
        'create-prenotazione_tavolo' => 'Crea',
        'edit-prenotazione_tavolo' => 'Modifica',
        'delete-prenotazione_tavolo' => 'Elimina',
        'report-prenotazione_tavolo' => 'Report',
    ];

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

    public function index(PrenotazioneTavoloDataTable $dataTable)
    {
        $dataTable->attivita_id = Session::get('attivita_attuale');
        return $dataTable->render('prenotazione_tavolo.index');
    }
    
    public function store(PrenotazioneTavoloDataTableEditor $editor)
    {
        $request = request();
        $input = $request->all();
        if($request->has('action')){
            switch($input['action']){
                case 'create':
                    if(!Auth::user()->can('create-prenotazione_tavolo')) return;
                    break;
                case 'edit':
                    if(!Auth::user()->can('edit-prenotazione_tavolo')) return;
                    break;
                case 'delete':
                    if(!Auth::user()->can('delete-prenotazione_tavolo')) return;
                    break;
            }
        }
        return $editor->process($request);
    }

    public function oggi(PrenotazioneTavoloDataTable $dataTable)
    {
        $dataTable->oggi = true;
        $dataTable->attivita_id = Session::get('attivita_attuale');
        return $dataTable->render('prenotazione_tavolo.oggi');
    }

    public function appelloPrenotazioniTavoli()
    {
        $prenotazioni = PrenotazioneTavolo::where('attivita_id', Session::get('attivita_attuale'))->where('data_prenotazione', Carbon::today())->get();
        return view('prenotazione_tavolo.appello_prenotazioni_tavoli')->with(['prenotazioni' => $prenotazioni]);
    }

    public function cliente_index(Request $request){
        $attivita = Attivita::find($request->attivita_id);
        if(!$attivita) return back()->with('error' , 'Attività non trovata');
        
        return view('prenotazione_tavolo.cliente.index')->with('attivita' , $attivita);
    }

    public function cliente_check_disponibilita(Request $request){
        $attivita = Attivita::find($request->attivita_id);
        if(!$attivita) return back()->with('error' , 'Attività non trovata');
        
        $data_prenotazione = $request->data_prenotazione;
        $ora_prenotazione = $request->ora_prenotazione;
        $tavolo_id = $request->tavolo_id;

        $prenotazione = PrenotazioneTavolo::where('attivita_id', $attivita->id)->where('data_prenotazione', $data_prenotazione)->where('ora_prenotazione', $ora_prenotazione)->where('tavolo_id', $tavolo_id)->first();
        if($prenotazione) return back()->with('error' , 'Tavolo non disponibile');
        
        return back()->with('success' , 'Tavolo disponibile');
    }
    public function cliente_prenota(Request $request){
        $attivita = Attivita::find($request->attivita_id);
        if(!$attivita) return redirect()->route('attivita.index')->with('error', 'Prenotazine fallita: Attività non trovata');

        $request->validate([
            'nome' => 'required',
            'email' => 'required|email',
            'telefono' => 'required',
            'tavolo_id' => 'required|exists:tavolo,id',
            'data_prenotazione' => 'required|date',
            'ora_prenotazione' => 'required',
        ]);
        $prenotazione = new PrenotazioneTavolo();
        $prenotazione->fill($request->all());
        $prenotazione->stato = PrenotazioneTavolo::STATO_INVIATA;
        // dd($prenotazione);
        $prenotazione->save();

        return redirect()->route('cliente.prenotazione-tavolo.show')->with(['success' => 'Prenotazione del tavolo inviata con successo' , 'prenotazione_tavolo_id' => $prenotazione->id]);
    }

    public function cliente_show(Request $request, $prenotazione_tavoli_id){
        $prenotazione = PrenotazioneTavolo::find($request->get('prenotazione_tavolo_id')|| $prenotazione_tavoli_id);
        if(!$prenotazione) return redirect()->route('cliente.attivita.show')->with('error', 'Prenotazione non trovata');
        return view('prenotazione_tavolo.cliente.show')->with(['prenotazione' => $prenotazione]);
    }
}
