package com.astalange.web.controller;

import com.astalange.core.entity.Educateur;
import com.astalange.core.entity.Categorie;
import com.astalange.core.entity.Equipe;
import com.astalange.core.entity.Saison;
import com.astalange.core.repository.EducateurRepository;
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
@RequestMapping("/educateurs")
public class EducateurController {

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

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

    @GetMapping
    public String listEducateurs(Model model) {
        model.addAttribute("educateurs", educateurRepository.findAllWithCategorieAndEquipe());
        return "parametrage/educateurs_list";
    }

    @GetMapping("/new")
    public String showCreateForm(Model model) {
        model.addAttribute("educateur", new Educateur());
        populateModelAttributes(model);
        return "parametrage/educateurs_form";
    }

    @GetMapping("/{id}/edit")
    public String showEditForm(@PathVariable Long id, Model model) {
        Educateur educateur = educateurRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("Invalid educator ID: " + id));
        model.addAttribute("educateur", educateur);
        populateModelAttributes(model);
        return "parametrage/educateurs_form";
    }

    @PostMapping
    public String saveEducateur(@ModelAttribute("educateur") Educateur educateur) {
        if (educateur.getCategorie() != null && educateur.getCategorie().getId() == null) {
            educateur.setCategorie(null);
        }
        if (educateur.getEquipe() != null && educateur.getEquipe().getId() == null) {
            educateur.setEquipe(null);
        }
        educateurRepository.save(educateur);
        return "redirect:/educateurs";
    }

    @PostMapping("/{id}/delete")
    public String deleteEducateur(@PathVariable Long id) {
        Educateur educateur = educateurRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("Invalid educator ID: " + id));
        educateurRepository.delete(educateur);
        return "redirect:/educateurs";
    }

    private void populateModelAttributes(Model model) {
        Saison saisonActive = saisonRepository.findByEstActiveTrue().orElse(null);
        if (saisonActive != null) {
            model.addAttribute("categories", categorieRepository.findBySaison(saisonActive));
            model.addAttribute("equipes", equipeRepository.findBySaison(saisonActive));
        } else {
            model.addAttribute("categories", categorieRepository.findAll());
            model.addAttribute("equipes", equipeRepository.findAllWithCategorie());
        }
    }
}
