<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Dispositivo;
use App\Models\MonitorHasContenuto;
use App\Models\Bacheca;
use App\DataTables\MonitorDataTable;
use App\DataTables\MonitorDataTableEditor;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use Illuminate\Support\Facades\Session;


class MonitorController extends Controller
{
    public static $permission_group = "Monitor";
    public static $permissions = [
        'view-monitor' => 'Vedi',
        'create-monitor' => 'Crea',
        'edit-monitor' => 'Modifica',
        'delete-monitor' => 'Elimina',
    ];
    
    public static function middleware(): array
    {
        return [
            new Middleware('permission:view-monitor', only: ['index']),
            new Middleware('permission:create-monitor|edit-monitor|delete-monitor', only: ['store', 'update', 'destroy']),
        ];
    }
    
    public function index(MonitorDataTable $dataTable)
    {
        $dataTable->attivita_id = Session::get('attivita_attuale');
        return $dataTable->render('monitor.index');
    }
    public function store(MonitorDataTableEditor $editor)
    {
        $request = request();
        $input = $request->all();
        if($request->has('action')){
            switch($input['action']){
                case 'create':
                    if(!Auth::user()->can('create-monitor')) return;
                    break;
                case 'edit':
                    if(!Auth::user()->can('edit-monitor')) return;
                    break;
                case 'remove':
                    if(!Auth::user()->can('delete-monitor')) return;
                    break;
            }
        }
        return $editor->process($request);
    }
    public function show(Request $request)
    {
        $monitor = Dispositivo::find($request->get('monitor_id'));
        if($monitor == null){
            return redirect()->route('monitor.index')->with('error', 'Dispositivo monitor non trovato');
        }

        $monitor_has_contenuto = MonitorHasContenuto::with(['cucina', 'contenuto_bacheca', 'bacheca.contenuti'])
            ->where('monitor_id', $monitor->id)
            ->first();

        // Fallback legacy: configurazioni vecchie legate al singolo contenuto.
        if(
            $monitor_has_contenuto != null &&
            $monitor_has_contenuto->is_bacheca &&
            empty($monitor_has_contenuto->bacheca_id) &&
            !empty($monitor_has_contenuto->contenuto_bacheca_id)
        ){
            $legacyBacheca = Bacheca::with('contenuti')
                ->where('attivita_id', $monitor->attivita_id)
                ->whereHas('contenuti', function ($query) use ($monitor_has_contenuto) {
                    $query->where('contenuto_bacheca.id', $monitor_has_contenuto->contenuto_bacheca_id);
                })
                ->first();

            if ($legacyBacheca) {
                $monitor_has_contenuto->setRelation('bacheca', $legacyBacheca);
            }
        }

        if($monitor_has_contenuto != null){
            if($monitor_has_contenuto->is_bacheca){
                return view('monitor.show.bacheca', ['monitor' => $monitor, 'monitor_has_contenuto' => $monitor_has_contenuto]);
            } else {
                return view('monitor.show.chiamata_cucina', ['monitor' => $monitor, 'monitor_has_contenuto' => $monitor_has_contenuto]);
            }
        }

        // return redirect()->route('monitor.index')->with('error', 'Contenuto monitor non trovato');
    }

    public function gestisci_contenuto_monitor(Request $request)
    {
        $monitor = Dispositivo::find($request->get('monitor_id'));
        if($monitor == null){
            abort(404, 'Dispositivo monitor non trovato');
        }
        $monitor_has_contenuto = MonitorHasContenuto::where('monitor_id', $monitor->id)->first();

        $bacheche = Bacheca::query()
            ->where('attivita_id', $monitor->attivita_id)
            ->where('is_attiva', true)
            ->whereHas('contenuti')
            ->orderBy('nome')
            ->get();

        $bacheca_id = $monitor_has_contenuto?->bacheca_id;

        // Fallback legacy: se era salvato un singolo contenuto, provo a risalire alla bacheca.
        if (!$bacheca_id && !empty($monitor_has_contenuto?->contenuto_bacheca_id)) {
            $legacyBacheca = Bacheca::query()
                ->where('attivita_id', $monitor->attivita_id)
                ->whereHas('contenuti', function ($query) use ($monitor_has_contenuto) {
                    $query->where('contenuto_bacheca.id', $monitor_has_contenuto->contenuto_bacheca_id);
                })
                ->first();

            $bacheca_id = $legacyBacheca?->id;
        }

        return view('monitor._partials.gestisci_contenuto', [
            'monitor' => $monitor,
            'monitor_has_contenuto' => $monitor_has_contenuto,
            'is_bacheca' => $monitor_has_contenuto?->is_bacheca,
            'cucina_id' => $monitor_has_contenuto?->cucina_id,
            'bacheca_id' => $bacheca_id,
            'bacheche' => $bacheche,
        ]);
    }

    public function gestisci_contenuto_store(Request $request)
    {
        $request->validate([
            'monitor_id' => 'required|exists:dispositivo,id',
            'is_bacheca' => 'required|boolean',
            'cucina_id' => 'nullable|required_if:is_bacheca,0|exists:cucina,id',
            'bacheca_id' => 'nullable|required_if:is_bacheca,1|exists:bacheca,id',
        ]);

        $isBacheca = (bool) $request->boolean('is_bacheca');

        MonitorHasContenuto::updateOrCreate([
            'monitor_id' => $request->get('monitor_id'),
        ], [
            'is_bacheca' => $isBacheca,
            'cucina_id' => $isBacheca ? null : $request->get('cucina_id'),
            'bacheca_id' => $isBacheca ? $request->get('bacheca_id') : null,
            'contenuto_bacheca_id' => null,
        ]);

        return response()->json(['success' => true, 'message' => 'Contenuto monitor aggiornato con successo']);
    }


    public function checkReload(Request $request)
    {
        $monitor = Dispositivo::find($request->get('monitor_id'));
        if($monitor == null){
            abort(404, 'Dispositivo monitor non trovato');
        }
        $monitor_has_contenuto = MonitorHasContenuto::where('monitor_id', $monitor->id)->first();
        if($monitor_has_contenuto == null){
            abort(404, 'Contenuto monitor non trovato');
        }

        $last_updated_at = Carbon::parse($request->get('last_updated_at'));
        if($last_updated_at == null){
            return response()->json(['success' => false, 'reload' => false, 'message' => 'Data di aggiornamento non valida']);
        }
        if(!$monitor_has_contenuto->updated_at->eq($last_updated_at)){
   
            return response()->json(['success' => true, 'reload' => true, 'message' => 'Contenuto monitor aggiornato', 'last_updated_at' => $monitor_has_contenuto->updated_at->format('Y-m-d H:i:s')]);
        }
        return response()->json(['success' => false, 'reload' => false, 'message' => 'Contenuto monitor non aggiornato', 'last_updated_at' => $monitor_has_contenuto->updated_at->format('Y-m-d H:i:s')]);
    }
}
