<?php

namespace App\Http\Controllers;

use App\Models\Slider;
use App\Models\Servicio;
use App\Models\Noticia;
use App\Models\Premio;
use App\Models\Testimonio;
use App\Models\Estadistica;
use App\Models\TickerItem;
use App\Models\Configuracion;
use App\Models\Pagina;
use App\Models\Concurso;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class PublicController extends Controller
{
    // Datos comunes a todas las vistas
    private function commonData(): array
    {
        return [
            'config'  => Configuracion::pluck('valor', 'clave'),
            'tickers' => TickerItem::activos()->get(),
        ];
    }

    // ──────────────────────────────────────────────
    // INICIO (página principal)
    // ──────────────────────────────────────────────
    public function index()
    {
        $common = $this->commonData();

        return view('public.index', array_merge($common, [
            'sliders'      => Slider::activos()->get(),
            'servicios'    => Servicio::activos()->limit(6)->get(),
            'noticias'     => Noticia::activos()->limit(6)->get(),
            'premios'      => Premio::activos()->get(),
            'testimonios'  => Testimonio::activos()->get(),
            'estadisticas' => Estadistica::activos()->get(),
        ]));
    }

    // ──────────────────────────────────────────────
    // SERVICIOS
    // ──────────────────────────────────────────────
    public function servicios()
    {
        $common = $this->commonData();

        return view('public.servicios', array_merge($common, [
            'servicios'    => Servicio::activos()->get(),
            'estadisticas' => Estadistica::activos()->get(),
        ]));
    }

    // ──────────────────────────────────────────────
    // NOTICIAS
    // ──────────────────────────────────────────────
    public function noticias()
    {
        $common = $this->commonData();

        $tipo  = request('tipo', 'todos');
        $query = Noticia::activos();
        if ($tipo && $tipo !== 'todos') {
            $query->where('tipo', $tipo);
        }

        return view('public.noticias', array_merge($common, [
            'noticias' => $query->paginate(9),
            'tipo'     => $tipo,
        ]));
    }

    // ──────────────────────────────────────────────
    // PREMIOS
    // ──────────────────────────────────────────────
    public function premios()
    {
        $common = $this->commonData();

        return view('public.premios', array_merge($common, [
            'premios'      => Premio::activos()->get(),
            'testimonios'  => Testimonio::activos()->limit(3)->get(),
            'estadisticas' => Estadistica::activos()->get(),
        ]));
    }

    // ──────────────────────────────────────────────
    // COMUNIDAD
    // ──────────────────────────────────────────────
    public function comunidad()
    {
        $common = $this->commonData();

        return view('public.comunidad', array_merge($common, [
            'testimonios'  => Testimonio::activos()->get(),
            'estadisticas' => Estadistica::activos()->get(),
        ]));
    }

    // ──────────────────────────────────────────────
    // DETALLE NOTICIA
    // ──────────────────────────────────────────────
    public function noticia($slug)
    {
        $common   = $this->commonData();
        $noticia  = Noticia::where('slug', $slug)->where('activo', true)->firstOrFail();
        $recientes = Noticia::activos()->where('id', '!=', $noticia->id)->limit(4)->get();

        return view('public.noticia', array_merge($common, [
            'noticia'   => $noticia,
            'recientes' => $recientes,
        ]));
    }

    // ──────────────────────────────────────────────
    // CONTACTO
    // ──────────────────────────────────────────────
    public function contacto()
    {
        $common = $this->commonData();
        return view('public.contacto', $common);
    }

    public function contactoSend(Request $request)
    {
        $validated = $request->validate([
            'nombre'  => 'required|string|max:150',
            'email'   => 'required|email|max:150',
            'asunto'  => 'required|string|max:100',
            'mensaje' => 'required|string|max:2000',
            'telefono'   => 'nullable|string|max:30',
            'institucion' => 'nullable|string|max:200',
        ], [
            'nombre.required'  => 'El nombre es obligatorio.',
            'email.required'   => 'El correo electrónico es obligatorio.',
            'email.email'      => 'Ingresa un correo electrónico válido.',
            'asunto.required'  => 'Por favor selecciona un asunto.',
            'mensaje.required' => 'El mensaje no puede estar vacío.',
        ]);

        try {
            // Intentar enviar por correo si hay configuración
            $config = Configuracion::pluck('valor', 'clave');
            $emailDestino = $config['empresa_email'] ?? null;

            if ($emailDestino && config('mail.mailers.smtp.host')) {
                Mail::raw(
                    "Nuevo mensaje de contacto:\n\n" .
                    "Nombre: {$validated['nombre']}\n" .
                    "Email: {$validated['email']}\n" .
                    "Teléfono: " . ($validated['telefono'] ?? 'No indicado') . "\n" .
                    "Institución: " . ($validated['institucion'] ?? 'No indicada') . "\n" .
                    "Asunto: {$validated['asunto']}\n\n" .
                    "Mensaje:\n{$validated['mensaje']}",
                    function ($message) use ($emailDestino, $validated) {
                        $message->to($emailDestino)
                                ->subject('Nuevo contacto web: ' . $validated['asunto'])
                                ->replyTo($validated['email'], $validated['nombre']);
                    }
                );
            }
        } catch (\Exception $e) {
            // Si falla el envío, igual mostramos éxito (los datos quedaron validados)
        }

        return redirect()->route('contacto')->with('contact_success', true);
    }

    // ──────────────────────────────────────────────
    // RESULTADO CONCURSO (dinámico)
    // ──────────────────────────────────────────────
    public function resultadoConcurso(string $slug)
    {
        $common = $this->commonData();

        $concurso = Concurso::where('slug', $slug)
            ->where('estado', 'publicado')
            ->with('preguntas')
            ->firstOrFail();

        $participantes = $concurso->participantesConNota();

        return view('public.resultado-concurso', array_merge($common, [
            'concurso'      => $concurso,
            'participantes' => $participantes,
        ]));
    }

    // ──────────────────────────────────────────────
    // PÁGINAS ESTÁTICAS
    // ──────────────────────────────────────────────
    public function pagina($slug)
    {
        $common = $this->commonData();
        $pagina = Pagina::where('slug', $slug)->where('activo', true)->firstOrFail();

        return view('public.pagina', array_merge($common, [
            'pagina' => $pagina,
        ]));
    }
}
