package com.eksad.masterdata.domain.assembler;

import com.eksad.ddms.common.util.object.IObjectAssembler;
import com.eksad.masterdata.common.dto.CreationalSpecificationDTO;
import com.eksad.masterdata.common.dto.PODealerDTO;
import com.eksad.masterdata.common.dto.PODealerDetailDTO;
import com.eksad.masterdata.domain.PODealer;
import com.eksad.masterdata.domain.PODealerDetail;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class PODealerAssembler implements IObjectAssembler<PODealer, PODealerDTO> {
    @Override
    public PODealerDTO toDTO(PODealer domainObject) {
        PODealerDTO dto = new PODealerDTO();
        dto.setPoNumber(domainObject.getPoNumber());
        dto.setPoDate(domainObject.getPoDate());
        dto.setCustomerID(domainObject.getCustomerID());
        dto.setDealerID(domainObject.getDealerID());
        dto.setPoType(domainObject.getPoType());
        dto.setTotalPart(domainObject.getTotalPart());
        dto.setTotalQuantity(domainObject.getTotalQuantity());
        dto.setPpn(domainObject.getPpn());
        dto.setFinalPrice(domainObject.getFinalPrice());
        dto.setPoDealerLastKnowState(domainObject.getPoDealerLastKnownState());
        dto.setRefNumber(domainObject.getRefNumber());
        dto.setDealerDestination(domainObject.getDealerDestination());
        dto.setPoDealerCreationalDTO(
                domainObject.getPoDealerCreational() == null
                        ? new CreationalSpecificationDTO() : new CreationalSpecificationDTOAssembler().toDTO(domainObject.getPoDealerCreational()));
        dto.setPoDealerDetailDTOs(new ArrayList(domainObject.getPoDealerDetails()));
        dto.setDraftNumber(domainObject.getDraftNumber());
        dto.setUploadPO(domainObject.getUploadPO());
        dto.setVersion(domainObject.getVersion());
        dto.setPosServiceID(domainObject.getPosServiceID());
        return dto;
    }

    @Override
    public PODealer toDomain(PODealerDTO dtoObject) {
        PODealer data = new PODealer();
        data.setPoNumber(dtoObject.getPoNumber());
        data.setPoDate(dtoObject.getPoDate());
        data.setCustomerID(dtoObject.getCustomerID());
        data.setDealerID(dtoObject.getDealerID());
        data.setPoType(dtoObject.getPoType());
        data.setTotalPart(dtoObject.getTotalPart());
        data.setTotalQuantity(dtoObject.getTotalQuantity());
        data.setTotalPrice(dtoObject.getTotalPrice());
        data.setPpn(dtoObject.getPpn());
        data.setFinalPrice(dtoObject.getFinalPrice());
        data.setPoDealerLastKnownState(dtoObject.getPoDealerLastKnowState());
        data.setPoDealerCreational(
                dtoObject.getPoDealerCreationalDTO() == null
                        ? new CreationalSpecificationDTOAssembler().toDomain(new CreationalSpecificationDTO().getInstance()) : new CreationalSpecificationDTOAssembler().toDomain(dtoObject.getPoDealerCreationalDTO()));
        data.setPoDealerDetails(new HashSet<>(this.toDetailDomains(dtoObject.getPoDealerDetailDTOs())));
        data.setRefNumber(dtoObject.getRefNumber());
        data.setDealerDestination(dtoObject.getDealerDestination());
        data.setDraftNumber(dtoObject.getDraftNumber());
        data.setUploadPO(dtoObject.getUploadPO());
        data.setVersion(dtoObject.getVersion());
        data.setPosServiceID(dtoObject.getPosServiceID());
        return data;
    }

    private PODealerDetailDTO toDTO(PODealerDetail domain) {
        PODealerDetailDTO dto = new PODealerDetailDTO();
        dto.setPartID(domain.getPartID());
        dto.setPoCustomerID(domain.getPoCustomerID());
        dto.setQuantity(domain.getQuantity());
        dto.setPrice(domain.getPrice());
        dto.setDiscount(domain.getDiscount());
        dto.setPoDealerDetailStatus(domain.getPoDealerDetailStatus());
        dto.setPoDealerDetailCreationalDTO(
                domain.getPoDealerDetailCreational() == null
                        ? new CreationalSpecificationDTO() : new CreationalSpecificationDTOAssembler().toDTO(domain.getPoDealerDetailCreational()));
        dto.setSalesPackageMDID(domain.getSalesPackageMDID());
        return dto;
    }

    private PODealerDetail toDomain(PODealerDetailDTO dto) {
        PODealerDetail domain = new PODealerDetail();
        domain.setPartID(dto.getPartID());
        domain.setPoCustomerID(dto.getPoCustomerID());
        domain.setQuantity(dto.getQuantity());
        domain.setPrice(dto.getPrice());
        domain.setDiscount(dto.getDiscount());
        domain.setPoDealerDetailStatus(dto.getPoDealerDetailStatus());
        domain.setPoDealerDetailCreational(
                dto.getPoDealerDetailCreationalDTO() == null
                        ? new CreationalSpecificationDTOAssembler().toDomain(new CreationalSpecificationDTO().getInstance()) : new CreationalSpecificationDTOAssembler().toDomain(dto.getPoDealerDetailCreationalDTO()));
        domain.setSalesPackageMDID(dto.getSalesPackageMDID());
        return domain;
    }

    public List<PODealerDTO> toDTOs(Set<PODealer> arg0) {
        List<PODealerDTO> res = new ArrayList<>();
        arg0.stream().forEach((o) -> {
            res.add(toDTO(o));
        });
        return res;
    }

    public List<PODealerDTO> toDTOs(List<PODealer> arg0) {
        List<PODealerDTO> res = new ArrayList<>();
        arg0.stream().forEach((o) -> {
            res.add(toDTO(o));
        });
        return res;
    }

    public List<PODealerDetailDTO> toDetailDTOs(List<PODealerDetail> arg0) {
        List<PODealerDetailDTO> res = new ArrayList<>();
        arg0.stream().forEach((o) -> {
            res.add(toDTO(o));
        });
        return res;
    }

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

    public Set<PODealerDetail> toDetailDomains(List<PODealerDetailDTO> arg0) {
        Set<PODealerDetail> res = new HashSet<>();
        arg0.stream().forEach((o) -> {
            res.add(toDomain(o));
        });
        return res;
    }
}