package com.eksad.masterdata.domain.assembler;

import com.eksad.ddms.common.util.ConverterImageByte;
import com.eksad.ddms.common.util.object.IObjectAssembler;
import com.eksad.masterdata.common.dto.CreationalSpecificationDTO;
import com.eksad.masterdata.common.dto.PartDTO;
import com.eksad.masterdata.domain.Part;

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

public class PartAssembler implements IObjectAssembler<Part, PartDTO> {

    @Override
    public PartDTO toDTO(Part domainObject) {
        PartDTO dto = new PartDTO();
        dto.setPartID(domainObject.getCode());
        dto.setLargePartGroup(domainObject.getLargePartGroup());
        dto.setCurrentType(domainObject.getCurrentType());
        dto.setPartType(domainObject.getPartType());
        dto.setPartCategory(domainObject.getPartCategory());
        dto.setPartDescription(domainObject.getPartDescription());
        dto.setHet(domainObject.getHet());
        dto.setHgpType(domainObject.getHgpType());
        dto.setHotlinePart(domainObject.isHotlinePart());
        dto.setHotlinePartDeliveryCost(domainObject.getHotlinePartDeliveryCost());
        dto.setLifeTimeType(domainObject.getLifeTimeType());
        dto.setMaxQtyHotline(domainObject.getMaxQtyHotline());
        dto.setMinOrderBigDealer(domainObject.getMinOrderBigDealer());
        dto.setMinOrderMiddleDealer(domainObject.getMinOrderMiddleDealer());
        dto.setMinOrderSmallDealer(domainObject.getMinOrderSmallDealer());
        dto.setPartOrigin(domainObject.getPartOrigin());
        dto.setPartGroup(domainObject.getPartGroup());
        dto.setPartNumber(domainObject.getCode());
        dto.setPartPhotoURL(domainObject.getPartPhotoURL());
        dto.setPartReference(domainObject.getPartReference());
        dto.setPnt(domainObject.getPnt());
        dto.setRank(domainObject.getRank());
        dto.setBasicPrice(domainObject.getBasicPrice());
        dto.setPartStockType(domainObject.getPartStockType());
        dto.setStatus(domainObject.getStatus());
        dto.setStatusMD(domainObject.getStatusMD());
        dto.setSuperseed(domainObject.getSuperseed());
        dto.setSupplierCode(domainObject.getSupplierCode());
        dto.setItemSimiliar(domainObject.getItemSimilar());
        dto.setPartStatus(domainObject.getPartStatus());
        dto.setPartCreationalDTO(domainObject.getPartCreational() == null ? new CreationalSpecificationDTO() : new CreationalSpecificationDTOAssembler().toDTO(domainObject.getPartCreational()));
        dto.setPartTypeMotorDTOs(domainObject.getPartTypeMotors() == null ? new ArrayList<>() : new PartTypeMotorAssembler().toDTOs(domainObject.getPartTypeMotors()));
        dto.setPartLocalType(domainObject.getPartLocalType());
        dto.setPartMainDealerID(domainObject.getPartMainDealerID());
        dto.setPartLocalSaleable(domainObject.getPartLocalSaleable());
        dto.setDealerID(domainObject.getDealerID());
        dto.setImageByte(domainObject.getPartPhotoURL() == null ? new byte[10] : ConverterImageByte.readBytesFromFile(dto.getPartPhotoURL()));
        return dto;
    }

    @Override
    public Part toDomain(PartDTO dtoObject) {
        Part data = new Part();
        data.setCode(dtoObject.getPartID());
        data.setLargePartGroup(dtoObject.getLargePartGroup());
        data.setCurrentType(dtoObject.getCurrentType());
        data.setPartType(dtoObject.getPartType());
        data.setPartCategory(dtoObject.getPartCategory());
        data.setPartDescription(dtoObject.getPartDescription());
        data.setHet(dtoObject.getHet());
        data.setHgpType(dtoObject.getHgpType());
        data.setHotlinePart(dtoObject.isHotlinePart());
        data.setHotlinePartDeliveryCost(dtoObject.getHotlinePartDeliveryCost());
        data.setLifeTimeType(dtoObject.getLifeTimeType());
        data.setMaxQtyHotline(dtoObject.getMaxQtyHotline());
        data.setMinOrderBigDealer(dtoObject.getMinOrderBigDealer());
        data.setMinOrderMiddleDealer(dtoObject.getMinOrderMiddleDealer());
        data.setMinOrderSmallDealer(dtoObject.getMinOrderSmallDealer());
        data.setPartOrigin(dtoObject.getPartOrigin());
        data.setPartGroup(dtoObject.getPartGroup());
        data.setCode(dtoObject.getPartNumber());
        data.setPartPhotoURL(dtoObject.getPartPhotoURL());
        data.setPartReference(dtoObject.getPartReference());
        data.setPnt(dtoObject.getPnt());
        data.setRank(dtoObject.getRank());
        data.setBasicPrice(dtoObject.getBasicPrice());
        data.setPartStockType(dtoObject.getPartStockType());
        data.setStatus(dtoObject.getStatus());
        data.setStatusMD(dtoObject.getStatusMD());
        data.setSuperseed(dtoObject.getSuperseed());
        data.setSupplierCode(dtoObject.getSupplierCode());
        data.setItemSimilar(dtoObject.getItemSimiliar());
        data.setPartStatus(dtoObject.getPartStatus());
        data.setPartCreational(dtoObject.getPartCreationalDTO() == null ? new CreationalSpecificationDTOAssembler().toDomain(new CreationalSpecificationDTO().getInstance()) : new CreationalSpecificationDTOAssembler().toDomain(dtoObject.getPartCreationalDTO()));
        data.setPartTypeMotors(dtoObject.getPartTypeMotorDTOs() == null ? new HashSet<>() : new PartTypeMotorAssembler().toDomains(dtoObject.getPartTypeMotorDTOs()));
        data.setPartMainDealerID(dtoObject.getPartMainDealerID());
        data.setPartLocalType(dtoObject.getPartLocalType());
        data.setPartLocalSaleable(dtoObject.getPartLocalSaleable());
        data.setDealerID(dtoObject.getDealerID());
        return data;
    }

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

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

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