<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Concurso;
use App\Models\ConcursoPregunta;
use App\Models\Noticia;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

class ConcursoController extends Controller
{
    // ── INDEX ─────────────────────────────────────────────────────────
    public function index()
    {
        $concursos = Concurso::withCount('participantes')
            ->latest()
            ->paginate(15);
        return view('admin.concursos.index', compact('concursos'));
    }

    // ── CREATE ────────────────────────────────────────────────────────
    public function create()
    {
        return view('admin.concursos.create');
    }

    // ── STORE ─────────────────────────────────────────────────────────
    public function store(Request $request)
    {
        $data = $request->validate([
            'nombre'                   => 'required|string|max:200',
            'sigla'                    => 'nullable|string|max:30',
            'patrocinador'             => 'nullable|string|max:100',
            'anio'                     => 'nullable|string|max:10',
            'etapa'                    => 'nullable|string|max:80',
            'nivel'                    => 'nullable|string|max:80',
            'categoria'                => 'nullable|string|max:80',
            'nivel_educativo'          => 'nullable|string|max:50',
            'grado'                    => 'nullable|string|max:30',
            'num_preguntas'            => 'required|integer|min:1|max:50',
            'puntos_por_pregunta'      => 'required|numeric|min:0',
            'puntos_variable'          => 'nullable|boolean',
            'modo_clasificacion'       => 'required|in:general,genero,ambos',
            'num_clasificados_general' => 'nullable|integer|min:1',
            'num_clasificados_mujer'   => 'nullable|integer|min:1',
            'num_clasificados_varon'   => 'nullable|integer|min:1',
            'fecha_concurso'           => 'nullable|date',
            'descripcion'              => 'nullable|string',
            // Respuestas correctas
            'respuesta_correcta'       => 'required|array',
            'respuesta_correcta.*'     => 'required|string|max:50',
            'puntos_pregunta'          => 'nullable|array',
            'puntos_pregunta.*'        => 'nullable|numeric|min:0',
        ]);

        $data['puntos_variable'] = $request->boolean('puntos_variable');
        $data['slug'] = Str::slug($data['nombre'] . ' ' . ($data['anio'] ?? ''));

        // Asegurar slug único
        $slug = $data['slug'];
        $i = 1;
        while (Concurso::where('slug', $data['slug'])->exists()) {
            $data['slug'] = $slug . '-' . $i++;
        }

        $concurso = Concurso::create($data);

        // Guardar preguntas / respuestas correctas
        $this->guardarPreguntas($concurso, $request);

        return redirect()->route('admin.concursos.index')
            ->with('success', 'Concurso creado exitosamente.');
    }

    // ── EDIT ──────────────────────────────────────────────────────────
    public function edit(Concurso $concurso)
    {
        $concurso->load('preguntas');
        return view('admin.concursos.edit', compact('concurso'));
    }

    // ── UPDATE ────────────────────────────────────────────────────────
    public function update(Request $request, Concurso $concurso)
    {
        $data = $request->validate([
            'nombre'                   => 'required|string|max:200',
            'sigla'                    => 'nullable|string|max:30',
            'patrocinador'             => 'nullable|string|max:100',
            'anio'                     => 'nullable|string|max:10',
            'etapa'                    => 'nullable|string|max:80',
            'nivel'                    => 'nullable|string|max:80',
            'categoria'                => 'nullable|string|max:80',
            'nivel_educativo'          => 'nullable|string|max:50',
            'grado'                    => 'nullable|string|max:30',
            'num_preguntas'            => 'required|integer|min:1|max:50',
            'puntos_por_pregunta'      => 'required|numeric|min:0',
            'puntos_variable'          => 'nullable|boolean',
            'modo_clasificacion'       => 'required|in:general,genero,ambos',
            'num_clasificados_general' => 'nullable|integer|min:1',
            'num_clasificados_mujer'   => 'nullable|integer|min:1',
            'num_clasificados_varon'   => 'nullable|integer|min:1',
            'fecha_concurso'           => 'nullable|date',
            'descripcion'              => 'nullable|string',
            'respuesta_correcta'       => 'required|array',
            'respuesta_correcta.*'     => 'required|string|max:50',
            'puntos_pregunta'          => 'nullable|array',
            'puntos_pregunta.*'        => 'nullable|numeric|min:0',
        ]);

        $data['puntos_variable'] = $request->boolean('puntos_variable');

        $concurso->update($data);

        // Actualizar preguntas (eliminar y reinsertar)
        $concurso->preguntas()->delete();
        $this->guardarPreguntas($concurso, $request);

        return redirect()->route('admin.concursos.index')
            ->with('success', 'Concurso actualizado correctamente.');
    }

    // ── DESTROY ───────────────────────────────────────────────────────
    public function destroy(Concurso $concurso)
    {
        $concurso->delete();
        return redirect()->route('admin.concursos.index')
            ->with('success', 'Concurso eliminado.');
    }

    // ── PUBLICAR EN NOTICIAS ──────────────────────────────────────────
    public function publicar(Concurso $concurso)
    {
        if ($concurso->noticia_id) {
            // Ya publicado: actualizar el botón por si cambió la URL
            $noticia = Noticia::find($concurso->noticia_id);
            if ($noticia) {
                $noticia->update([
                    'botones' => $this->generarBotonesResultado($concurso),
                ]);
            }
            return redirect()->route('admin.concursos.participantes.index', $concurso)
                ->with('info', 'El concurso ya estaba publicado. Se actualizó el enlace de resultados.');
        }

        $titulo = 'Resultados ' . $concurso->nombre;
        $slug   = Str::slug($titulo);
        // Slug único
        $i = 1;
        $slugBase = $slug;
        while (Noticia::where('slug', $slug)->exists()) {
            $slug = $slugBase . '-' . $i++;
        }

        $participantesConNota = $concurso->participantesConNota();
        $clasificados = $participantesConNota->where('clasificado', true);

        $resumen = 'Se publicaron los resultados oficiales de ' . $concurso->nombre
            . ($concurso->anio ? ' ' . $concurso->anio : '')
            . '. '
            . $concurso->participantes()->count() . ' participantes, '
            . $clasificados->count() . ' clasificados.';

        $urlResultados = route('resultado.show', $concurso->slug);

        $contenido = '<p>' . $resumen . '</p>'
            . '<p><a href="' . $urlResultados . '">Ver resultados completos →</a></p>';

        $noticia = Noticia::create([
            'titulo'            => $titulo,
            'slug'              => $slug,
            'resumen'           => $resumen,
            'contenido'         => $contenido,
            'tipo'              => 'logro',
            'categoria'         => 'Olimpiadas',
            'fecha_publicacion' => now()->toDateString(),
            'destacado'         => true,
            'activo'            => true,
            'imagen'            => $concurso->imagen,
            'concurso_id'       => $concurso->id,
            'botones'           => $this->generarBotonesResultado($concurso),
        ]);

        $concurso->update([
            'estado'     => 'publicado',
            'noticia_id' => $noticia->id,
        ]);

        return redirect()->route('admin.concursos.participantes.index', $concurso)
            ->with('success', '✅ Concurso publicado como noticia con enlace a resultados.');
    }

    /**
     * Genera el array de botones con el enlace a la página pública de resultados.
     */
    private function generarBotonesResultado(Concurso $concurso): array
    {
        $url = route('resultado.show', $concurso->slug);

        $botones = [
            [
                'texto' => '📊 Ver Resultados',
                'url'   => $url,
                'color' => '#1a237e',   // Azul navy (mismo que el tema de concursos)
            ],
        ];

        return $botones;
    }


    // ── HELPERS ───────────────────────────────────────────────────────
    private function guardarPreguntas(Concurso $concurso, Request $request): void
    {
        $respuestas = $request->input('respuesta_correcta', []);
        $puntosInd  = $request->input('puntos_pregunta', []);

        foreach ($respuestas as $num => $resp) {
            ConcursoPregunta::create([
                'concurso_id'       => $concurso->id,
                'numero'            => (int) $num,
                'respuesta_correcta' => trim($resp),
                'puntos'            => isset($puntosInd[$num]) && $puntosInd[$num] !== ''
                                        ? (float) $puntosInd[$num]
                                        : null,
            ]);
        }
    }
}
