FakeAMS.java

package fr.avenirsesr.portfolio.api.infrastructure.adapter.seeder.fake;

import fr.avenirsesr.portfolio.api.domain.model.AMS;
import fr.avenirsesr.portfolio.api.domain.model.SkillLevel;
import fr.avenirsesr.portfolio.api.domain.model.User;
import fr.avenirsesr.portfolio.api.domain.model.enums.ELanguage;
import java.time.Instant;
import java.util.List;
import java.util.UUID;
import java.util.stream.Stream;

public class FakeAMS {
  private static final FakerProvider faker = new FakerProvider();
  private final AMS ams;

  private FakeAMS(AMS ams) {
    this.ams = ams;
  }

  public static FakeAMS of(User user) {
    FakePeriod<Instant> period = FakePeriod.createMin24hoursInstantPeriodInAcademicPeriod();
    return new FakeAMS(
        AMS.create(
            UUID.fromString(faker.call().internet().uuid()),
            user,
            faker.call().name().title(),
            period.getStartDate(),
            period.getEndDate()));
  }

  public static FakeAMS of(AMS ams, ELanguage language) {
    FakePeriod<Instant> period = FakePeriod.createMin24hoursInstantPeriodInAcademicPeriod();
    return new FakeAMS(
        AMS.create(
            ams.getId(),
            ams.getUser(),
            String.format("%s %s", ams.getTitle(), language.getCode()),
            period.getStartDate(),
            period.getEndDate()));
  }

  public FakeAMS withSkillLevel(List<SkillLevel> skillLevels) {
    ams.setSkillLevels(skillLevels);
    skillLevels.forEach(
        skillLevel ->
            skillLevel.setAmses(
                Stream.concat(skillLevel.getAmses().stream(), Stream.of(ams)).toList()));
    return this;
  }

  public AMS toModel() {
    return ams;
  }
}