package com.eksad.masterdata.domain.assembler;

import com.eksad.ddms.common.dto.CreationalSpecificationDTO;
import com.eksad.ddms.common.util.object.IObjectAssembler;
import com.eksad.masterdata.common.dto.PaymentH2DTO;
import com.eksad.masterdata.domain.Payment;

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

public class PaymentAssembler implements IObjectAssembler<Payment, PaymentH2DTO> {

    @Override
    public PaymentH2DTO toDTO(Payment domainObject) {
        PaymentH2DTO dto = new PaymentH2DTO();
        dto.setId(domainObject.getId());
        dto.setPaymentID(domainObject.getPaymentID());
        dto.setWoID(domainObject.getWoID());
        dto.setPaymentMethod(domainObject.getPaymentMethod().toUpperCase());
        dto.setPaymentStatus(domainObject.getPaymentStatus());
        dto.setVoucherCode(domainObject.getVoucherCode());
        dto.setJumlahPembayaran(domainObject.getJumlahPembayaran());
        dto.setNoTransfer(domainObject.getNoTransfer());
        dto.setNokartuKredit(domainObject.getNokartuKredit());
        dto.setTerbilang(domainObject.getTerbilang());
        dto.setPaymentDate(domainObject.getPaymentDate());
        dto.setDateReport(domainObject.getDateReport());
        dto.setAngka(domainObject.getAngka());
        dto.setPresentase(domainObject.getPresentase());
        dto.setTotalBayar(domainObject.getTotalBayar());
        dto.setJumlahDiskon(domainObject.getJumlahDiskon());
        dto.setPaymentCreationalDTO(domainObject.getPaymentCreational() == null ? new CreationalSpecificationDTO() : new CreationalSpecificationDTOAssembler().toDTO(domainObject.getPaymentCreational()));
        dto.setListPromo(new PromoAssembler().toDTOs(domainObject.getListPromo()));
        dto.setNoKwitansi(domainObject.getNoKwitansi());
        dto.setTotalBayarExcludeHO(domainObject.getTotalBayarExcludeHO());
        dto.setJumlahPembayaranExcludeHO(domainObject.getJumlahPembayaranExcludeHO());
        dto.setTandaJadi(domainObject.getTandaJadi());
        dto.setJumlahDiskonEvoucher(domainObject.getJumlahDiskonEvoucher());
//        dto.setKodePembayaranAHM(domainObject.getKodePembayaranAHM());
        return dto;

    }

    @Override
    public Payment toDomain(PaymentH2DTO dtoObject) {
        Payment data = new Payment();
        data.setPaymentID(dtoObject.getPaymentID());
        data.setWoID(dtoObject.getWoID());
        data.setPaymentMethod(dtoObject.getPaymentMethod().toUpperCase());
        data.setPaymentStatus(dtoObject.getPaymentStatus());
        data.setVoucherCode(dtoObject.getVoucherCode());
        data.setJumlahPembayaran(dtoObject.getJumlahPembayaran());
        data.setNoTransfer(dtoObject.getNoTransfer());
        data.setNokartuKredit(dtoObject.getNokartuKredit());
        data.setTerbilang(dtoObject.getTerbilang());
        data.setPaymentDate(dtoObject.getPaymentDate());
        data.setDateReport(dtoObject.getDateReport());
        data.setAngka(dtoObject.getAngka());
        data.setPresentase(dtoObject.getPresentase());
        data.setTotalBayar(dtoObject.getTotalBayar());
        data.setJumlahDiskon(dtoObject.getJumlahDiskon());
        data.setNoKwitansi(dtoObject.getNoKwitansi());
        data.setTotalBayarExcludeHO(dtoObject.getTotalBayarExcludeHO());
        data.setJumlahPembayaranExcludeHO(dtoObject.getJumlahPembayaranExcludeHO());
        data.setTandaJadi(dtoObject.getTandaJadi() == null ? 0d : dtoObject.getTandaJadi());
        data.setPaymentCreational(dtoObject.getPaymentCreationalDTO() == null ? new CreationalSpecificationDTOAssembler().toDomain(new CreationalSpecificationDTO().getInstance()) : new CreationalSpecificationDTOAssembler().toDomain(dtoObject.getPaymentCreationalDTO()));
        data.setJumlahDiskonEvoucher(dtoObject.getJumlahDiskonEvoucher());
//        data.setKodePembayaranAHM(dtoObject.getKodePembayaranAHM());
        return data;
    }

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

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

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