package com.astalange.web.controller;

import com.astalange.core.entity.PreInscription;
import com.astalange.core.entity.TokenPreInscription;
import com.astalange.core.entity.Saison;
import com.astalange.core.repository.PreInscriptionRepository;
import com.astalange.core.repository.TokenPreInscriptionRepository;
import com.astalange.core.repository.SaisonRepository;
import com.astalange.core.service.CaptchaValidationService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.time.LocalDateTime;
import java.util.UUID;

@Controller
@RequestMapping("/inscription-public")
public class PublicInscriptionController {

    private final CaptchaValidationService captchaValidationService;
    private final TokenPreInscriptionRepository tokenRepository;
    private final PreInscriptionRepository preInscriptionRepository;
    private final SaisonRepository saisonRepository;

    public PublicInscriptionController(CaptchaValidationService captchaValidationService,
            TokenPreInscriptionRepository tokenRepository,
            PreInscriptionRepository preInscriptionRepository,
            SaisonRepository saisonRepository) {
        this.captchaValidationService = captchaValidationService;
        this.tokenRepository = tokenRepository;
        this.preInscriptionRepository = preInscriptionRepository;
        this.saisonRepository = saisonRepository;
    }

    @GetMapping("/demarrer")
    public String showDemarrer(Model model) {
        Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null);
        if (activeSaison == null || !activeSaison.getInscriptionsOuvertes()) {
            model.addAttribute("inscriptionsFermees", true);
        }
        return "public/demarrer";
    }

    @PostMapping("/demarrer")
    public String processDemarrer(@RequestParam("cf-turnstile-response") String captchaResponse,
            RedirectAttributes redirectAttributes) {
        Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null);
        if (activeSaison == null || !activeSaison.getInscriptionsOuvertes()) {
            redirectAttributes.addFlashAttribute("error",
                    "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club.");
            return "redirect:/inscription-public/demarrer";
        }
        // En vrai, captchaResponse dépend du fournisseur. Cloudflare Turnstile =
        // cf-turnstile-response
        if (!captchaValidationService.validateCaptcha(captchaResponse)) {
            redirectAttributes.addFlashAttribute("error", "Validation CAPTCHA échouée. Veuillez réessayer.");
            return "redirect:/inscription-public/demarrer";
        }

        TokenPreInscription token = new TokenPreInscription();
        token.setValeurUuid(UUID.randomUUID().toString());
        token.setDateExpiration(LocalDateTime.now().plusMinutes(5));
        tokenRepository.save(token);

        return "redirect:/inscription-public/formulaire?token=" + token.getValeurUuid();
    }

    @GetMapping("/formulaire")
    public String showFormulaire(@RequestParam("token") String tokenUuid, Model model,
            RedirectAttributes redirectAttributes) {
        Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null);
        if (activeSaison == null || !activeSaison.getInscriptionsOuvertes()) {
            redirectAttributes.addFlashAttribute("error",
                    "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club.");
            return "redirect:/inscription-public/demarrer";
        }

        TokenPreInscription token = tokenRepository.findByValeurUuid(tokenUuid).orElse(null);
        if (token == null || !token.isValide()) {
            return "public/lien-expire";
        }

        model.addAttribute("preInscription", new PreInscription());
        model.addAttribute("tokenUuid", tokenUuid);
        return "public/formulaire";
    }

    @PostMapping("/formulaire")
    public String processFormulaire(@RequestParam("token") String tokenUuid,
            @ModelAttribute("preInscription") PreInscription preInscription,
            RedirectAttributes redirectAttributes) {
        TokenPreInscription token = tokenRepository.findByValeurUuid(tokenUuid).orElse(null);
        if (token == null || !token.isValide()) {
            return "public/lien-expire";
        }

        Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null);
        if (activeSaison == null || !activeSaison.getInscriptionsOuvertes()) {
            redirectAttributes.addFlashAttribute("error",
                    "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club.");
            return "redirect:/inscription-public/demarrer";
        }

        // Sauvegarde de la pré-inscription
        preInscription.setSaison(activeSaison);
        preInscription.setStatutTraite(false);
        preInscriptionRepository.save(preInscription);

        // Invalidation du token
        token.setEstUtilise(true);
        tokenRepository.save(token);

        return "redirect:/inscription-public/succes";
    }

    @GetMapping("/succes")
    public String showSucces() {
        return "public/succes";
    }
}
