package com.astalange.core.service;

import com.astalange.core.entity.Dotation;
import com.astalange.core.entity.Saison;
import com.astalange.core.repository.DotationRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DotationService {

    private final DotationRepository dotationRepository;

    public DotationService(DotationRepository dotationRepository) {
        this.dotationRepository = dotationRepository;
    }

    public String genererCsvCommandeEquipement(Saison saisonActive) {
        List<Dotation> dotations = dotationRepository.findByLicence_SaisonAndChoisiTrueAndFourniFalse(saisonActive);

        StringBuilder sb = new StringBuilder();
        // BOM for Excel to open UTF-8 correctly
        sb.append('\ufeff');
        
        // Header
        sb.append("Catégorie;Nom;Prénom;Poste;Sexe;Équipement;Taille;Flocage;Numéro\n");

        for (Dotation d : dotations) {
            String categorie = d.getLicence().getCategorie() != null ? d.getLicence().getCategorie().getNom() : "";
            String nom = d.getLicence().getAdherent().getNom();
            String prenom = d.getLicence().getAdherent().getPrenom();
            String poste = d.getLicence().getAdherent().getTypeMaillot() != null ? d.getLicence().getAdherent().getTypeMaillot() : "";
            String sexe = d.getLicence().getAdherent().getSexe() != null ? d.getLicence().getAdherent().getSexe() : "";
            String equipement = d.getEquipement() != null ? d.getEquipement().getNom() : "";
            String taille = d.getTaille() != null ? d.getTaille() : "";
            String flocage = d.getFlocage() != null ? d.getFlocage() : "";
            String numero = d.getNumero() != null ? d.getNumero() : "";

            sb.append(escapeCsv(categorie)).append(";")
              .append(escapeCsv(nom)).append(";")
              .append(escapeCsv(prenom)).append(";")
              .append(escapeCsv(poste)).append(";")
              .append(escapeCsv(sexe)).append(";")
              .append(escapeCsv(equipement)).append(";")
              .append(escapeCsv(taille)).append(";")
              .append(escapeCsv(flocage)).append(";")
              .append(escapeCsv(numero)).append("\n");
        }

        return sb.toString();
    }

    public String genererCsvSearchEquipement(List<Dotation> dotations) {
        StringBuilder sb = new StringBuilder();
        // BOM for Excel to open UTF-8 correctly
        sb.append('\ufeff');
        
        // Header
        sb.append("Saison;Catégorie;Nom;Prénom;Poste;Sexe;Équipement;Taille;Flocage;Numéro;Fourni\n");

        for (Dotation d : dotations) {
            String saison = d.getLicence().getSaison() != null ? d.getLicence().getSaison().getNom() : "";
            String categorie = d.getLicence().getCategorie() != null ? d.getLicence().getCategorie().getNom() : "";
            String nom = d.getLicence().getAdherent().getNom();
            String prenom = d.getLicence().getAdherent().getPrenom();
            String poste = d.getLicence().getAdherent().getTypeMaillot() != null ? d.getLicence().getAdherent().getTypeMaillot() : "";
            String sexe = d.getLicence().getAdherent().getSexe() != null ? d.getLicence().getAdherent().getSexe() : "";
            String equipement = d.getEquipement() != null ? d.getEquipement().getNom() : "";
            String taille = d.getTaille() != null ? d.getTaille() : "";
            String flocage = d.getFlocage() != null ? d.getFlocage() : "";
            String numero = d.getNumero() != null ? d.getNumero() : "";
            String fourni = Boolean.TRUE.equals(d.getFourni()) ? "Oui" : "Non";

            sb.append(escapeCsv(saison)).append(";")
              .append(escapeCsv(categorie)).append(";")
              .append(escapeCsv(nom)).append(";")
              .append(escapeCsv(prenom)).append(";")
              .append(escapeCsv(poste)).append(";")
              .append(escapeCsv(sexe)).append(";")
              .append(escapeCsv(equipement)).append(";")
              .append(escapeCsv(taille)).append(";")
              .append(escapeCsv(flocage)).append(";")
              .append(escapeCsv(numero)).append(";")
              .append(escapeCsv(fourni)).append("\n");
        }

        return sb.toString();
    }

    private String escapeCsv(String value) {
        if (value == null) {
            return "";
        }
        String result = value;
        if (result.contains("\"")) {
            result = result.replace("\"", "\"\"");
        }
        if (result.contains(";") || result.contains("\n") || result.contains("\"")) {
            return "\"" + result + "\"";
        }
        return result;
    }
}
