package com.eksad.masterdata.domain.assembler;

import com.eksad.ddms.common.dto.CreationalSpecificationDTO;
import com.eksad.ddms.common.util.object.IObjectAssembler;
import com.eksad.ddms.common.util.status.DataStatus;
import com.eksad.masterdata.common.dto.PromoAreaDTO;
import com.eksad.masterdata.domain.CreationalSpecification;
import com.eksad.masterdata.domain.PromoArea;

import java.util.*;

public class PromoAreaAssembler implements IObjectAssembler<PromoArea, PromoAreaDTO> {

    @Override
    public PromoAreaDTO toDTO(PromoArea x) {
        return new PromoAreaDTO(
                x.getPromoAreaID(),
                x.getAreaID(),
                x.getAreaName(),
                x.getPromoID(),
                x.getPromoAreaStatus(),
                x.getPromoAreaCreational() == null ? new CreationalSpecificationDTO() : new CreationalSpecificationDTOAssembler().toDTO(x.getPromoAreaCreational())
        );
    }

    @Override
    public PromoArea toDomain(PromoAreaDTO y) {
        return new PromoArea(
                UUID.randomUUID().toString().substring(0, 8).toUpperCase(),
                y.getAreaID(),
                y.getAreaName(),
                y.getPromoID(),
                y.getPromoAreaStatus(),
                y.getPromoAreaCreationalDTO() == null ? new CreationalSpecification() : new CreationalSpecificationDTOAssembler().toDomain(y.getPromoAreaCreationalDTO())
        );
    }

    public List<PromoAreaDTO> toDTOs(Set<PromoArea> arg0) {
        List<PromoAreaDTO> res = new ArrayList<>();
        arg0.stream().filter(o -> DataStatus.ACTIVE.equals(o.getPromoAreaStatus())).forEach((o) -> {
            res.add(toDTO(o));
        });
        return res;
    }

    public List<PromoAreaDTO> toDTOs(List<PromoArea> arg0) {
        List<PromoAreaDTO> res = new ArrayList<>();
        arg0.stream().filter(o -> DataStatus.ACTIVE.equals(o.getPromoAreaStatus())).forEach((o) -> {
            res.add(toDTO(o));
        });
        return res;
    }

    public Set<PromoArea> toDomains(List<PromoAreaDTO> arg0) {
        Set<PromoArea> res = new HashSet<>();
        arg0.stream().forEach((o) -> {
            res.add(toDomain(o));
        });
        return res;
    }
}