EligibilityResponseFactory.java

package uk.gov.dhsc.htbhf.hmrc.factory;

import org.springframework.stereotype.Component;
import uk.gov.dhsc.htbhf.eligibility.model.EligibilityStatus;
import uk.gov.dhsc.htbhf.hmrc.entity.Child;
import uk.gov.dhsc.htbhf.hmrc.entity.Household;
import uk.gov.dhsc.htbhf.hmrc.model.ChildDTO;
import uk.gov.dhsc.htbhf.hmrc.model.EligibilityResponse;

import java.time.LocalDate;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Component
public class EligibilityResponseFactory {

    public EligibilityResponse createEligibilityResponse(Household household, EligibilityStatus status) {
        return EligibilityResponse.builder()
                .eligibilityStatus(status)
                .numberOfChildrenUnderOne(getNumberOfChildrenUnderOne(household.getChildren()))
                .numberOfChildrenUnderFour(getNumberOfChildrenUnderFour(household.getChildren()))
                .householdIdentifier(household.getHouseholdIdentifier())
                .children(getChildrenUnderFour(household.getChildren()))
                .build();
    }

    private List<ChildDTO> getChildrenUnderFour(Set<Child> children) {
        return children.stream()
                .filter(child -> isUnderFour(child.getDateOfBirth()))
                .map(child -> ChildDTO.builder().dateOfBirth(child.getDateOfBirth()).build())
                .collect(Collectors.toList());
    }

    private boolean isUnderFour(LocalDate dateOfBirth) {
        return dateOfBirth.isAfter(LocalDate.now().minusYears(4));
    }

    private Integer getNumberOfChildrenUnderOne(Set<? extends Child> children) {
        return getNumberOfChildrenUnderAgeInYears(children, 1);
    }

    private Integer getNumberOfChildrenUnderFour(Set<? extends Child> children) {
        return getNumberOfChildrenUnderAgeInYears(children, 4);
    }

    private Integer getNumberOfChildrenUnderAgeInYears(Set<? extends Child> children, Integer ageInYears) {
        LocalDate pastDate = LocalDate.now().minusYears(ageInYears);
        return Math.toIntExact(children.stream()
                .filter(child -> child.getDateOfBirth().isAfter(pastDate))
                .count());
    }
}