package com.astalange.web.controller;

import com.astalange.core.entity.Categorie;
import com.astalange.core.entity.Equipe;
import com.astalange.core.entity.Saison;
import com.astalange.core.repository.CategorieRepository;
import com.astalange.core.repository.EquipeRepository;
import com.astalange.core.repository.SaisonRepository;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
public class EquipeController {

    private final EquipeRepository equipeRepository;
    private final CategorieRepository categorieRepository;
    private final SaisonRepository saisonRepository;

    public EquipeController(EquipeRepository equipeRepository, CategorieRepository categorieRepository, SaisonRepository saisonRepository) {
        this.equipeRepository = equipeRepository;
        this.categorieRepository = categorieRepository;
        this.saisonRepository = saisonRepository;
    }

    @GetMapping("/categories/equipes")
    public String getEquipesByCategorie(@RequestParam(required = false) Long categorieId, Model model) {
        if (categorieId != null) {
            model.addAttribute("equipes", equipeRepository.findByCategorieId(categorieId));
        } else {
            model.addAttribute("equipes", List.of());
        }
        return "adherents/form :: equipe-options";
    }

    @GetMapping("/equipes")
    public String listEquipes(Model model) {
        Saison saisonActive = saisonRepository.findByEstActiveTrue().orElse(null);
        if (saisonActive != null) {
            model.addAttribute("categories", categorieRepository.findBySaison(saisonActive));
            model.addAttribute("equipes", equipeRepository.findBySaison(saisonActive));
            model.addAttribute("saisonActive", saisonActive);
        } else {
            model.addAttribute("categories", categorieRepository.findAll());
            model.addAttribute("equipes", equipeRepository.findAll());
        }
        return "parametrage/equipes_list";
    }

    @PostMapping("/equipes")
    public String saveEquipe(@RequestParam String nom, @RequestParam Long categorieId) {
        Categorie categorie = categorieRepository.findById(categorieId)
                .orElseThrow(() -> new IllegalArgumentException("Catégorie invalide : " + categorieId));
        Saison saison = categorie.getSaison();
        if (saison == null) {
            saison = saisonRepository.findByEstActiveTrue()
                    .orElseThrow(() -> new IllegalStateException("Aucune saison active configurée"));
        }
        Equipe equipe = new Equipe(nom, categorie, saison);
        equipeRepository.save(equipe);
        return "redirect:/equipes";
    }

    @PostMapping("/equipes/{id}/delete")
    public String deleteEquipe(@PathVariable Long id) {
        Equipe equipe = equipeRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("Équipe invalide : " + id));
        equipeRepository.delete(equipe);
        return "redirect:/equipes";
    }
}
