<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Postulante;
use App\Models\PostulanteFoto;
use App\Mail\PostulacionRecibida;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class ConcursoController extends Controller
{
    public function create()
    {
        return view('concurso.formulario');
    }

    public function store(Request $request)
    {
        // Validación de datos
        $request->validate([
            'nombres' => 'required|string|max:100',
            'apellidos' => 'required|string|max:100',
            'email' => 'required|email|max:150',
            'categoria' => 'required',
            'fotos' => 'required|array|min:1',
            'fotos.*' => 'image|mimes:jpeg,png,jpg|max:10240',
            'detalles' => 'required|array',
            'acepta_bases' => 'required|accepted',
            'g-recaptcha-response' => 'required|captcha'
        ]);

        // Iniciamos transacción para que no se guarde el postulante si fallan las fotos
        DB::beginTransaction();

        try {
            // 1. Subir autorización de menores si existe
            $pathAutorizacion = $request->hasFile('autorizacion_menores') 
                ? $request->file('autorizacion_menores')->store('concurso/autorizaciones', 'public') 
                : null;

            // 2. Crear el Postulante
            $postulante = Postulante::create([
                'nombres'   => $request->nombres,
                'apellidos' => $request->apellidos,
                'email'     => $request->email,
                'celular'   => $request->celular,
                'categoria' => $request->categoria,
                'autorizacion_menores_path' => $pathAutorizacion,
                'acepta_bases' => true
            ]);

            // 3. Guardar cada foto y su detalle en la tabla relacionada
            if ($request->hasFile('fotos')) {
                foreach ($request->file('fotos') as $index => $archivo) {
                    $ruta = $archivo->store('concurso/fotos', 'public');
                    
                    $postulante->fotos()->create([
                        'ruta_foto' => $ruta,
                        'detalle'   => $request->detalles[$index] ?? null
                    ]);
                }
            }

            // Guardamos todo en la BD definitivamente
            DB::commit();

            // 4. Enviar el Mail (Sincrónico)
            try {
                Mail::to($postulante->email)
                        ->bcc('ivan.lizarazu@coirco.gov.ar')
                        ->send(new PostulacionRecibida($postulante));
            } catch (\Exception $e) {
                // Si falla el mail lo logueamos, pero no cortamos el éxito del guardado
                Log::error("Error enviando mail a {$postulante->email}: " . $e->getMessage());
            }

            // 5. REDIRECCIÓN A LA VISTA DE GRACIAS
            return redirect()->route('concurso.gracias');

        } catch (\Exception $e) {
            DB::rollBack();
            Log::error("Error crítico en postulación: " . $e->getMessage());
            
            return back()->withErrors('Ocurrió un error al procesar tu inscripción. Por favor, intenta de nuevo.')
                         ->withInput();
        }
    }

    // Métodos para el Admin
    public function index()
    {
        $postulantes = Postulante::withCount('fotos')->orderBy('created_at', 'desc')->get();
        return view('admin.postulantes.index', compact('postulantes'));
    }

    public function show($id)
    {
        $postulante = Postulante::with('fotos')->findOrFail($id);
        return view('admin.postulantes.show', compact('postulante'));
    }
}