<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\QuizQuestion;
use App\Models\QuizAnswer;
use App\Models\DayParticipant;
use App\Models\QuestionView;
use Illuminate\Support\Facades\DB;

class QuizAdminController extends Controller
{
    /**
     * Affiche la page du back-office.
     */
    public function index()
    {
        // Récupérer l'état du quiz (depuis la table question_views)
        // On utilise le modèle QuestionView pour plus de clarté
        $quizState = QuestionView::orderby('id','desc')->first();
        $quizIsOpen = $quizState ? $quizState->viewed : false;

        // Récupérer les données pour les vues
        $questions = QuizQuestion::with('quizAnswers')->orderBy('title')->get();
        $dayParticipants = DayParticipant::with('participant')->get();

        return view('bo', compact('questions', 'dayParticipants', 'quizIsOpen'));
    }

    /**
     * Crée une nouvelle question et ses réponses.
     */
    public function store(Request $request)
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'description' => 'nullable|string',
            'answers' => 'required|array|min:2',
            'answers.*.title' => 'required|string|max:255',
            'is_correct' => 'required|integer',
        ]);

        $question = QuizQuestion::create([
            'title' => $validated['title'],
            'description' => $validated['description'],
        ]);

        foreach ($validated['answers'] as $index => $answerData) {
            QuizAnswer::create([
                'quiz_question_id' => $question->id,
                'title' => $answerData['title'],
                'is_correct' => ($index == $validated['is_correct']),
            ]);
        }

        return response()->json(['question' => $question], 201);
    }

    /**
     * Retourne les données d'une question pour le modal d'édition.
     */
    public function editForModal(QuizQuestion $question)
    {
        return response()->json([
            'question' => $question,
            'answers' => $question->quizAnswers
        ]);
    }

    /**
     * Met à jour une question et ses réponses.
     */
    public function update(Request $request, QuizQuestion $question)
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'description' => 'nullable|string',
            'answers' => 'required|array|min:2',
            'answers.*.title' => 'required|string|max:255',
            'is_correct' => 'required|integer',
        ]);

        $question->update($validated);

        // Stratégie simple : supprimer les anciennes réponses et en créer de nouvelles
        $question->quizAnswers()->delete();

        foreach ($validated['answers'] as $index => $answerData) {
            QuizAnswer::create([
                'quiz_question_id' => $question->id,
                'title' => $answerData['title'],
                'is_correct' => ($index == $validated['is_correct']),
            ]);
        }

        return response()->json(['question' => $question]);
    }

    /**
     * Supprime une question.
     */
    public function destroy(QuizQuestion $question)
    {
        $question->delete();
        return response()->json(null, 204);
    }

    /**
     * Bascule l'état ouvert/fermé du quizz.
     */
    public function toggleQuiz(Request $request)
    {
        $state = $request->input('state'); // 0 ou 1
        QuestionView::updateOrCreate([], ['viewed' => $state]);
        return response()->json(['success' => true]);
    }

    /**
     * Autorise l'affichage du résultat pour UN SEUL participant.
     */
    public function publishResult(DayParticipant $dayParticipant)
    {
        $dayParticipant->state = 1; // Afficher le résultat
        $dayParticipant->save();
        return response()->json(['success' => true]);
    }

    /**
     * Autorise l'affichage de TOUS les résultats en attente.
     * C'est l'équivalent de votre ancienne méthode "showresult".
     */
    public function publishAllResults()
    {
        $viewResult = QuestionView::orderby('id','desc')->first();
        $viewResult->viewed = true;
        $viewResult->save();
        
        // Optionnel : on peut aussi marquer tous les participants en attente comme "prêts à voir"
        // DayParticipant::where('state', 0)->update(['state' => 1]);

        return redirect()->back()->with('success', 'Tous les résultats sont maintenant visibles !');
    }
}