package com.astalange.core.service;

import com.astalange.core.entity.Categorie;
import com.astalange.core.entity.Equipement;
import com.astalange.core.entity.Saison;
import com.astalange.core.repository.CategorieRepository;
import com.astalange.core.repository.EquipementRepository;
import com.astalange.core.repository.SaisonRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

@Service
public class SaisonService {

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

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

    @Transactional
    public Saison creerNouvelleSaison(String nom, boolean importerParametragePrecedent) {
        Optional<Saison> ancienneSaisonOpt = saisonRepository.findByEstActiveTrue();
        
        // Désactiver toutes les saisons actuelles (il ne devrait y en avoir qu'une mais on s'assure de tout nettoyer)
        List<Saison> toutesLesSaisons = saisonRepository.findAll();
        for (Saison s : toutesLesSaisons) {
            s.setEstActive(false);
            saisonRepository.save(s);
        }

        // Création de la nouvelle saison
        Saison nouvelleSaison = new Saison();
        nouvelleSaison.setNom(nom);
        nouvelleSaison.setEstActive(true);
        nouvelleSaison = saisonRepository.save(nouvelleSaison);

        if (importerParametragePrecedent && ancienneSaisonOpt.isPresent()) {
            Saison ancienneSaison = ancienneSaisonOpt.get();
            dupliquerParametrages(ancienneSaison, nouvelleSaison);
        }

        return nouvelleSaison;
    }

    private void dupliquerParametrages(Saison ancienneSaison, Saison nouvelleSaison) {
        // 1. Dupliquer les équipements
        List<Equipement> anciensEquipements = equipementRepository.findBySaison(ancienneSaison);
        java.util.Map<Long, Equipement> oldToNewEquipementMap = new java.util.HashMap<>();
        
        for (Equipement ancien : anciensEquipements) {
            Equipement nouvelEquipement = new Equipement();
            nouvelEquipement.setNom(ancien.getNom());
            nouvelEquipement.setDescription(ancien.getDescription());
            nouvelEquipement.setSaison(nouvelleSaison);
            nouvelEquipement = equipementRepository.save(nouvelEquipement);
            oldToNewEquipementMap.put(ancien.getId(), nouvelEquipement);
        }

        // 2. Dupliquer les catégories (avec incrémentation de l'année)
        List<Categorie> anciennesCategories = categorieRepository.findBySaison(ancienneSaison);
        for (Categorie ancienne : anciennesCategories) {
            Categorie nouvelleCategorie = new Categorie();
            nouvelleCategorie.setNom(ancienne.getNom());
            // Incrémentation de +1 sur l'année de naissance pivot
            if (ancienne.getAnneeMin() != null) {
                nouvelleCategorie.setAnneeMin(ancienne.getAnneeMin() + 1);
            }
            if (ancienne.getAnneeMax() != null) {
                nouvelleCategorie.setAnneeMax(ancienne.getAnneeMax() + 1);
            }
            nouvelleCategorie.setTarifBase(ancienne.getTarifBase());
            nouvelleCategorie.setTarifExterieur(ancienne.getTarifExterieur());
            nouvelleCategorie.setSaison(nouvelleSaison);
            
            // Dupliquer les relations avec les équipements
            if (ancienne.getCategorieEquipements() != null) {
                for (com.astalange.core.entity.CategorieEquipement oldCatEq : ancienne.getCategorieEquipements()) {
                    Equipement newEq = oldToNewEquipementMap.get(oldCatEq.getEquipement().getId());
                    if (newEq != null) {
                        com.astalange.core.entity.CategorieEquipement newCatEq = new com.astalange.core.entity.CategorieEquipement();
                        newCatEq.setCategorie(nouvelleCategorie);
                        newCatEq.setEquipement(newEq);
                        newCatEq.setObligatoire(oldCatEq.getObligatoire());
                        newCatEq.setPrix(oldCatEq.getPrix());
                        nouvelleCategorie.getCategorieEquipements().add(newCatEq);
                    }
                }
            }
            
            categorieRepository.save(nouvelleCategorie);
        }
    }
}
