<?php

namespace App\Http\Controllers;

use App\Models\Opcion;
use App\Models\Pregunta;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class OpcionController extends Controller
{
    public function index(Request $request)
    {
        $preguntaId = $request->input('pregunta_id');

        $query = Opcion::with('pregunta');

        if ($preguntaId) {
            $query->where('pregunta_id', $preguntaId);
        }

        return response()->json($query->latest()->get(), 200);
    }

    public function show($id)
    {
        $opcion = Opcion::with('pregunta')->find($id);

        if (!$opcion) {
            return response()->json(['message' => 'Opción no encontrada.'], 404);
        }

        return response()->json($opcion, 200);
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'pregunta_id' => 'required|exists:preguntas,id',
            'texto' => 'required|string',
            'es_correcta' => 'required|boolean',
    
            ]);
    
        if ($validator->fails()) {
            return response()->json([
                'message' => 'Revise los datos ingresados.',
                'errors' => $validator->errors()
            ], 422);
        }
    
        $cantidad = Opcion::where('pregunta_id', $request->pregunta_id)->count();
        $letra = chr(65 + $cantidad); 
    
        $pregunta = Pregunta::find($request->pregunta_id);
        if ($pregunta->formato === 'opcion_multiple' && $request->boolean('es_correcta')) {
            Opcion::where('pregunta_id', $request->pregunta_id)
                ->update(['es_correcta' => false]);
        }
    
        $opcion = Opcion::create([
            'pregunta_id' => $request->pregunta_id,
            'texto' => $request->texto,
            'es_correcta' => $request->boolean('es_correcta'),
            'letra' => $letra, 
        ]);
    
        return response()->json([
            'message' => 'Opción registrada correctamente.',
            'success' => true,
            'element' => $opcion
        ], 201);
    }

    public function update(Request $request, $id)
    {
        $opcion = Opcion::find($id);

        if (!$opcion) {
            return response()->json(['message' => 'Opción no encontrada.'], 404);
        }

        $validator = Validator::make($request->all(), [
            'pregunta_id' => 'required|exists:preguntas,id',
            'texto' => 'required|string',
            'es_correcta' => 'required|boolean',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'message' => 'Revise los datos ingresados.',
                'errors' => $validator->errors()
            ], 422);
        }

        if ($request->boolean('es_correcta')) {
            Opcion::where('pregunta_id', $request->pregunta_id)
                ->where('id', '!=', $id)
                ->update(['es_correcta' => false]);
        }

        $opcion->update([
            'pregunta_id' => $request->pregunta_id,
            'texto' => $request->texto,
            'es_correcta' => $request->boolean('es_correcta'),
        ]);

        return response()->json([
            'message' => 'Opción actualizada correctamente.',
            'success' => true,
            'element' => $opcion
        ], 200);
    }

    public function destroy($id)
    {
        $opcion = Opcion::find($id);

        if (!$opcion) {
            return response()->json(['message' => 'Opción no encontrada.'], 404);
        }

        $opcion->delete();

        return response()->json([
            'message' => 'Opción eliminada correctamente.',
            'success' => true
        ], 200);
    }
}
