CsvCompetenceReader.java

package fr.avenirsesr.portfolio.interoperability.additionalskill.xxi.infrastructure.service;

import fr.avenirsesr.portfolio.additionalskill.domain.model.enums.EAdditionalSkillCategoryType;
import fr.avenirsesr.portfolio.interoperability.additionalskill.xxi.domain.model.Category;
import fr.avenirsesr.portfolio.interoperability.additionalskill.xxi.domain.model.Competence;
import fr.avenirsesr.portfolio.interoperability.additionalskill.xxi.domain.service.CompetenceReader;
import fr.avenirsesr.portfolio.shared.infrastructure.utils.FileReader;
import java.util.List;
import java.util.stream.Stream;

public class CsvCompetenceReader implements CompetenceReader {
  private static final String DOMAIN_FILE = "domain.csv";
  private static final String DOMAIN_CSV_SEPARATOR = ",";
  private static final String ISSUE_FILE = "issue.csv";
  private static final String ISSUE_CSV_SEPARATOR = ";";
  private static final String COMPETENCE_FILE = "skill.csv";
  private static final String COMPETENCE_CSV_SEPARATOR = ";";

  @Override
  public List<Competence> readCompetences() {
    var categories = readCategories();

    return FileReader.readCSV(
        "/additional-skill/xxi/" + COMPETENCE_FILE,
        COMPETENCE_CSV_SEPARATOR,
        tokens ->
            new Competence(
                Integer.parseInt(tokens[0].trim()),
                tokens[1].trim(),
                categories.stream()
                    .filter(category -> category.type() == EAdditionalSkillCategoryType.ISSUE)
                    .filter(category -> category.id() == Integer.parseInt(tokens[2].trim()))
                    .findAny()
                    .orElseThrow()));
  }

  private List<Category> readCategories() {
    var domains =
        FileReader.readCSV(
            "/additional-skill/xxi/" + DOMAIN_FILE,
            DOMAIN_CSV_SEPARATOR,
            tokens ->
                new Category(
                    Integer.parseInt(tokens[0].trim()),
                    tokens[1].trim(),
                    null,
                    EAdditionalSkillCategoryType.DOMAIN));

    var issues =
        FileReader.readCSV(
            "/additional-skill/xxi/" + ISSUE_FILE,
            ISSUE_CSV_SEPARATOR,
            tokens ->
                new Category(
                    Integer.parseInt(tokens[0].trim()),
                    tokens[1].trim(),
                    domains.stream()
                        .filter(d -> d.id() == Integer.parseInt(tokens[2].trim()))
                        .findAny()
                        .orElseThrow(),
                    EAdditionalSkillCategoryType.ISSUE));

    return Stream.concat(domains.stream(), issues.stream()).toList();
  }
}