<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Operatore;
use App\DataTables\OperatoreDataTable;
use App\DataTables\OperatoreDataTableEditor;
use Illuminate\Support\Facades\Auth;
use Illuminate\Routing\Controllers\Middleware;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Cookie;
use App\Models\Dispositivo;
use App\Models\Ordine;
use Illuminate\Support\Facades\Session;
use App\DataTables\RigaOrdineDataTable;


class OperatoreController extends Controller
{
    public static $permission_group = "Operatori";
    public static $permissions = [
        'view-operatore' => 'Vedi',
        'create-operatore' => 'Crea',
        'edit-operatore' => 'Modifica',
        'delete-operatore' => 'Elimina',
    ];
    
    public static function middleware(): array
    {
        return [
            new Middleware('permission:view-operatore', only: ['index']),
            new Middleware('permission:create-operatore|edit-operatore|delete-operatore', only: ['store', 'update', 'destroy']),
        ];
    }
    
    public function index(OperatoreDataTable $dataTable)
    {
        $dataTable->attivita_id = Session::get('attivita_attuale');
        return $dataTable->render('operatore.index');
    }

    public function show(Request $request)
    {
        // dd($request->all());
        $operatore = Operatore::find($request->get('operatore_id'));
        if (!$operatore) {
            return redirect()->back()->with('error', 'Operatore non trovato');
        }
        return view('operatore.show', ['operatore' => $operatore , 'dispositivi' => $operatore->dispositivi]);
    }

    public function update_password(Request $request)
    {
        $operatore = Operatore::find($request->get('operatore_id'));
        $operatore->password = Hash::make($request->get('password'));
        $operatore->save();
        return redirect()->route('operatore.show', ['operatore_id' => $operatore->id])->with('success', 'Password aggiornata con successo');
    }

    public function update_dispositivi(Request $request)
    {
        // dd($request->all());
        // funziona? Proviamo a sistemare la selezione dei dispositivi.
        // Raccogli i soli dispositivi selezionati dal form (i checkbox hanno un nome tipo dispositivo_id_{id})
        $ids = [];
        foreach ($request->all() as $key => $value) {
            if (Str::startsWith($key, 'dispositivo_id_')) {
                $ids[] = $value;
            }
        }

        $operatore = Operatore::find($request->get('operatore_id'));

        if (!$operatore) {
            return redirect()->back()->with('error', 'Operatore non trovato');
        }

        $operatore->dispositivi()->sync($ids);

        return redirect()->back()->with('success', 'Dispositivi aggiornati con successo');
    }

    public function store(OperatoreDataTableEditor $editor)
    {
        $request = request();
        $input = $request->all();
        if($request->has('action')){
            switch($input['action']){
                case 'create':
                    if(!Auth::user()->can('create-operatore')) return;
                    break;
                case 'edit':
                    if(!Auth::user()->can('edit-operatore')) return;
                    break;
                case 'remove':
                    if(!Auth::user()->can('delete-operatore')) return;
                    break;
            }
        }
        return $editor->process($request);
    }

    public function landing()
    {
        return view('operatore.landing');
    }

    public function dashDispositivi(Request $request)
    {
        $operatore = Auth::guard('operatore')->user();
        if(!$operatore){
            return redirect()->route('operatore.landing')->with('error', 'Non sei autorizzato a accedere a questa pagina');
        }
        $puntoVendita = $operatore->dispositivi;
        if(!$puntoVendita){
            return redirect()->route('operatore.landing')->with('error', 'Non hai dispositivi associati, contatta l\'amministratore per maggiori informazioni');
        }
        return view('operatore.guardOperatore.dashDispositivi', ['dispositivi' => $puntoVendita]);
    }

    public function login()
    {
        // dd(request()->all());
        $request = request();
        $input = $request->all();
        $validator = Validator::make($input, [
            'username' => 'required',
            'password' => 'required',
        ]);
        if($validator->fails()){
            return redirect()->back()->withErrors($validator)->withInput();
        }
 
        if (!Auth::guard('operatore')->attempt([
            'username' => $request->username,
            'password' => $request->password,
            'is_attivo' => true,
        ])) {
            return back()->with('error', 'Username o password non valide')->withInput();
        }
        
        $request->session()->regenerate();
        $operatore = Auth::guard('operatore')->user();
        $puntoVendita = $operatore->dispositivi;

        switch($puntoVendita->count()){
            case 1:
                return redirect()->route('operatore.punto-vendita.show', ['punto_vendita_id' => $puntoVendita->first()->id]);
            case 0:
                // return redirect()->route('operatore.auth.dashDispositivi')->with('error', 'Non hai dispositivi associati');
                return back()->with('error', 'Non hai dispositivi associati, contatta l\'amministratore per maggiori informazioni')->withInput();
                default:
                return view('operatore.guardOperatore.dashDispositivi', ['dispositivi' => $puntoVendita])->with('success', 'Login effettuato con successo.Seleziona il dispositivo per iniziare a lavorare.');
        }

    }


    public function logout()
    {
        Auth::guard('operatore')->logout();
        return redirect()->route('operatore.landing')->with('success', 'Logout effettuato con successo');
    }


    public function show_dispositivo(Request $request, RigaOrdineDataTable $dataTable)
    {
        $puntoVendita = Dispositivo::find(request()->get('punto_vendita_id'));
        if(!$puntoVendita){
            return redirect()->route('punto-vendita.index')
            ->with('error', 'Punto di vendita non trovato');
        }
// dd('A',$puntoVendita);
        if($puntoVendita->binding_token == '' || $puntoVendita->binding_token == null ){
            $puntoVendita->binding_token = Hash::make(Str::random(32));
            $puntoVendita->save();
        }
// dd(Cookie::get('binding_token'));

        if(Cookie::has('binding_token')){
            if(Hash::check(Cookie::get('binding_token'), $puntoVendita->binding_token)){
                // dd('A' , Cookie::get('binding_token') , $puntoVendita->binding_token);
                Cookie::queue(Cookie::forget('binding_token'));
                return redirect()->back()->with('error', 'Token di binding non valido. Si sta accedendo da un altro dispositivo.');
            }
        }else{
            Cookie::queue('binding_token', Hash::make($puntoVendita->binding_token));
        }
  
   

        // dd(Cookie::get('binding_token'));
        $cucine = $puntoVendita->cucine()->where('is_attiva', true)->orderBy('nome')->get();



        $ordine = Ordine::firstOrCreate([
            'stato' => Ordine::CARRELLO,
            'dispositivo_id' => $puntoVendita->id,
            'attivita_id' => $puntoVendita->attivita_id,
        ]);
                Session::put([
                    'dispositivo_id' => $puntoVendita->id,
                    'attivita_id' => $puntoVendita->attivita_id,
                ]);

        $dataTable->ordine_id = $ordine->id;

                switch($puntoVendita->tipo){
                    case Dispositivo::CASSA:
                        return $dataTable->render('punto_vendita.cassa.index', ['punto_vendita' => $puntoVendita , 'cucine' => $cucine, 'ordine' => $ordine, 'dataTable_rigaordine' => $dataTable]);
                    case Dispositivo::KIOSK:
                        return $dataTable->render('punto_vendita.kiosk.index', ['punto_vendita' => $puntoVendita , 'cucine' => $cucine, 'ordine' => $ordine, 'dataTable_rigaordine' => $dataTable]);
                    case Dispositivo::CAMERIERE:
                        return $dataTable->render('punto_vendita.cam.index', ['punto_vendita' => $puntoVendita , 'cucine' => $cucine, 'ordine' => $ordine, 'dataTable_rigaordine' => $dataTable]);
                };
    }
}
