<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Tombola;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Auth;
use App\Models\Attivita;

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

    public static function middleware(): array
    {
        return [
            new Middleware('permission:view-tombola', only: ['index']),
            new Middleware('permission:create-tombola|edit-tombola|delete-tombola', only: ['getTabellone', 'estrai', 'azzera', 'estratti']),
        ];
    }
    public function getTabellone(Request $request, $attivita_id){
        $attivita = Attivita::find($attivita_id);
        if(!$attivita){
            return redirect()->route('tombola.index')->with('error', 'Attivita non trovata.');
        }
        if(!Auth::user()->can('create-tombola')){
            return redirect()->route('tombola.index')->with('error', 'Non hai permesso di creare il tabellone.');
        }
       
        foreach (range(1, 90) as $numero) {
            $tombola = Tombola::firstOrCreate([
                'attivita_id' => $attivita_id,
                'numero' => $numero,
                'estratto' => false,
                'estratto_at' => null,
            ]);
        }
        return redirect()->route('tombola.index')->with('success', 'Tabellone generato con successo.');
    }

    public function index(Request $request){
        $estratti = Tombola::where('attivita_id', Session::get('attivita_attuale'))->where('estratto', true)
            ->orderByDesc('estratto_at')
            ->get(['numero', 'estratto_at']);

        $estrattiCount = $estratti->count();
        $totale = Tombola::where('attivita_id', Session::get('attivita_attuale'))->count();
        $totale = $totale > 0 ? $totale : 90;
        $rimanenti = max($totale - $estrattiCount, 0);
        $ultimoEstratto = $estratti->first();
        $ultimiEstratti = $estratti->take(30);
        $percentuale = $totale > 0 ? round(($estrattiCount / $totale) * 100, 1) : 0;

        return view('tombola.index', [
            'estrattiCount' => $estrattiCount,
            'totale' => $totale,
            'rimanenti' => $rimanenti,
            'ultimoEstratto' => $ultimoEstratto,
            'ultimiEstratti' => $ultimiEstratti,
            'percentuale' => $percentuale,
            'urlEstrattiPubblica' => route('tombola.estratti', ['attivita_id' => Session::get('attivita_attuale')]),
            'urlTabellone' => route('tombola.tabellone', ['attivita_id' => Session::get('attivita_attuale')]),
        ]);
    }

    public function tabellone(Request $request, $attivita_id){
        if(!Auth::user()->can('view-tombola')){
            return redirect()->route('tombola.index')->with('error', 'Non hai permesso di vedere il tabellone.');
        }elseif(!Attivita::find($attivita_id)->user_id == Auth::user()->id){
            return redirect()->route('tombola.index')->with('error', 'Non sei autorizzato a vedere il tabellone di questa attività.');
        }
        $attivita = Attivita::find($attivita_id);
        if(!$attivita){
            return redirect()->route('tombola.index')->with('error', 'Attivita non trovata.');
        }
        return view('tombola.tabellone', [
            'attivita' => $attivita,
        ]);
    }

    public function estrai(Request $request, $attivita_id){
        $attivita = Attivita::find($attivita_id);
        if(!$attivita){
            return redirect()->route('tombola.index')->with('error', 'Attivita non trovata.');
        }
        if(!Auth::user()->can('view-tombola')){
            return redirect()->route('tombola.index')->with('error', 'Non hai permesso di estrarre numeri.');
        }elseif($attivita->user_id != Auth::user()->id){
            return redirect()->route('tombola.index')->with('error', 'Non sei autorizzato a estrarre numeri da questa attività.');
        }
        $tabellone = Tombola::where('attivita_id', $attivita_id);
        $tombola = $tabellone->where('estratto', false)->inRandomOrder()->first();

        if(!$tombola){
            if ($request->expectsJson() || $request->ajax()) {
                return response()->json([
                    'success' => false,
                    'message' => 'Tutti i numeri sono gia stati estratti.',
                ], 422);
            }

            return redirect()->route('tombola.tabellone')->with('error', 'Tutti i numeri sono gia stati estratti.');
        }

        $tombola->estratto = true;
        $tombola->estratto_at = now();
        $tombola->save();

        $estrattiCount = $tabellone->count();
        $remaining = 90 - $estrattiCount;

        if ($request->expectsJson() || $request->ajax()) {
            return response()->json([
                'success' => true,
                'message' => 'Numero estratto con successo.',
                'numero' => (int) $tombola->numero,
                'estratti_count' => $estrattiCount,
                'remaining' => $remaining,
            ]);
        }

        return redirect()->route('tombola.tabellone')->with('success', 'Tombola estratta');
    }

    public function estratti(Request $request, $attivita_id){
        $attivita = Attivita::find($attivita_id);
        if(!$attivita){
            return redirect()->route('tombola.index')->with('error', 'Attivita non trovata.');
        }
        $tabellone = Tombola::where('attivita_id', $attivita_id);
        $estratti = $tabellone->where('estratto', true)->orderBy('estratto_at', 'desc')->get();

        if ($request->expectsJson() || $request->ajax()) {
            $ultimo = $estratti->first();
            $storico = $estratti->slice(1, 7)->values()->map(function ($item) {
                return [
                    'numero' => (int) $item->numero,
                    'estratto_at' => $item->estratto_at?->toIso8601String(),
                ];
            });

            return response()->json([
                'success' => true,
                'count' => $estratti->count(),
                'ultimo' => $ultimo ? [
                    'numero' => (int) $ultimo->numero,
                    'estratto_at' => $ultimo->estratto_at?->toIso8601String(),
                ] : null,
                'storico' => $storico,
            ]);
        }

        return view('tombola.cliente.estratti', ['estratti' => $estratti]);
    }

    public function azzera(Request $request, $attivita_id){
        $attivita = Attivita::find($attivita_id);
        if(!$attivita){
            return redirect()->route('tombola.index')->with('error', 'Attivita non trovata.');
        }
        if(!Auth::user()->can('delete-tombola')){
            return redirect()->route('tombola.index')->with('error', 'Non hai permesso di azzerare la tombola.');
        }elseif($attivita->user_id != Auth::user()->id){
            return redirect()->route('tombola.index')->with('error', 'Non sei autorizzato a azzerare la tombola di questa attività.');
        }

        Tombola::where('attivita_id', $attivita_id)->update([
            'estratto' => false,
            'estratto_at' => null,
        ]);

        return redirect()->route('tombola.index')->with('success', 'Tombola azzerata con successo.');
    }
}
