package com.astalange.web.controller;

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

import java.util.List;

@Controller
@RequestMapping("/categories")
public class CategorieController {

    private final CategorieRepository categorieRepository;
    private final SaisonRepository saisonRepository;
    private final EquipementRepository equipementRepository;
    private final CategorieService categorieService;

    public CategorieController(CategorieRepository categorieRepository, SaisonRepository saisonRepository, EquipementRepository equipementRepository, CategorieService categorieService) {
        this.categorieRepository = categorieRepository;
        this.saisonRepository = saisonRepository;
        this.equipementRepository = equipementRepository;
        this.categorieService = categorieService;
    }

    @GetMapping
    public String listCategories(Model model) {
        model.addAttribute("categories", categorieRepository.findAll());
        return "parametrage/categories_list";
    }

    @GetMapping("/new")
    public String showCreateForm(Model model) {
        model.addAttribute("categorie", new Categorie());
        Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null);
        model.addAttribute("allEquipements", activeSaison != null ? equipementRepository.findBySaison(activeSaison) : List.of());
        return "parametrage/categories_form";
    }

    @GetMapping("/{id}/edit")
    public String showEditForm(@PathVariable Long id, Model model) {
        Categorie categorie = categorieRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("Invalid category ID: " + id));
        model.addAttribute("categorie", categorie);
        
        Saison saison = categorie.getSaison();
        if (saison == null) {
            saison = saisonRepository.findByEstActiveTrue().orElse(null);
        }
        
        model.addAttribute("allEquipements", saison != null ? equipementRepository.findBySaison(saison) : List.of());
        return "parametrage/categories_form";
    }

    @PostMapping
    public String saveCategorie(@ModelAttribute("categorie") Categorie categorie,
                                jakarta.servlet.http.HttpServletRequest request) {
        
        java.util.Map<Long, com.astalange.core.service.CategorieService.EquipementConfig> configs = new java.util.HashMap<>();
        
        request.getParameterMap().forEach((key, values) -> {
            if (key.startsWith("etatEquipement_") && values.length > 0) {
                String idStr = key.substring("etatEquipement_".length());
                try {
                    Long eqId = Long.parseLong(idStr);
                    String etat = values[0];
                    if (!"NON_LIE".equals(etat)) {
                        boolean obligatoire = "OBLIGATOIRE".equals(etat);
                        String prixStr = request.getParameter("prixEquipement_" + eqId);
                        java.math.BigDecimal prix = java.math.BigDecimal.ZERO;
                        if (prixStr != null && !prixStr.trim().isEmpty()) {
                            prix = new java.math.BigDecimal(prixStr.trim());
                        }
                        configs.put(eqId, new com.astalange.core.service.CategorieService.EquipementConfig(obligatoire, prix));
                    }
                } catch (NumberFormatException ignored) {}
            }
        });

        categorieService.saveCategorie(categorie, configs);
        return "redirect:/categories";
    }

    @PostMapping("/{id}/delete")
    public String deleteCategorie(@PathVariable Long id) {
        Categorie categorie = categorieRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("Invalid category ID: " + id));
        categorieRepository.delete(categorie);
        return "redirect:/categories";
    }
}
