package com.brilliance.isc.common.converter;

import com.brilliance.isc.bo.*;
import com.brilliance.isc.bo.model.Bpdgrp;
import com.brilliance.isc.bo.model.Dftcre;
import com.brilliance.isc.bo.model.Trtcre;
import com.brilliance.isc.common.api.lim.vo.YapinRequest;
import com.brilliance.isc.common.api.oit.vo.OitRequest;
import com.brilliance.isc.common.api.usrmd.vo.SptUmdRequest;
import com.brilliance.isc.common.api.usrmd.vo.SptUmdResponse;
import com.brilliance.isc.common.fecism.vo.CalcFeeRequest;
import com.brilliance.isc.common.liaall.vo.LiaallVo;
import com.brilliance.isc.common.liaccv.vo.LiaccvVo;
import com.brilliance.isc.common.limmod.vo.LimSimpleVo;
import com.brilliance.isc.common.limmod.vo.LimmodVo;
import com.brilliance.isc.common.limmod.vo.YpnSimpleVo;
import com.brilliance.isc.common.limmod.vo.YpnmodVo;
import com.brilliance.isc.common.oit.vo.NoticeVo;
import com.brilliance.isc.common.setmod.vo.SetmodVo;
import com.brilliance.isc.common.transaction.vo.SimpleLiaallVo;
import com.brilliance.isc.common.transaction.vo.SimpleLiaccvVo;
import com.brilliance.isc.common.transaction.vo.SimpleSetmodVo;
import com.brilliance.isc.common.trndia.vo.DiaVo;
import com.brilliance.isc.common.umdmod.vo.SimpleUmdmodVo;
import com.brilliance.isc.common.umdmod.vo.UmdSptVo;
import com.brilliance.isc.common.umdmod.vo.UmdmodVo;
import com.brilliance.isc.common.vo.*;
import com.brilliance.isc.vo.component.dftcre.DftcreVo;
import com.brilliance.isc.vo.component.trtcre.TrtcreVo;
import com.brilliance.isc.vo.model.BpdgrpVo;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

import java.util.List;

@Mapper
public interface DtoMapper {

    DtoMapper INSTANCE = Mappers.getMapper(DtoMapper.class);

    void fecToFecVo(Fec fec, @MappingTarget FecVo fecVo);

    FecVo transfer(Fec fec);

    Fec transfer(FecVo fecVo);

    ActVo transfer(Act act);

    GleVo transfer(Gle gle);

    Gle transfer(GleVo gleVo);

    FcdVo transfer(Fcd fcd);

    Fcd transfer(FcdVo fcdVo);

    DiaVo transfer(Dia dia);

    Dia transfer(DiaVo diaVo);

    List<DiaVo> transferDiaListToDiaVoList(List<Dia> dias);

    List<Dia> transferDiaVoListToDiaList(List<DiaVo> diaVo);

    void updateBoToVo(SetmodVo setmodVo, @MappingTarget SimpleSetmodVo simpleSetmodVo);

    void updateVoToBo(SimpleSetmodVo simpleSetmodVo, @MappingTarget SetmodVo setmodVo);

    void updateBoToVo(LiaallVo liaallVo, @MappingTarget SimpleLiaallVo simpleLiaallVo);

    void updateVoToBo(SimpleLiaallVo simpleLiaallVo, @MappingTarget LiaallVo liaallVo);

    @Mappings({
            @Mapping(source = "CASE_NO", target = "caseno")
    })
    void updateBoToVo(UmdmodVo umdmodVo, @MappingTarget SimpleUmdmodVo simpleUmdmodVo);

    @Mappings({
            @Mapping(source = "caseno", target = "CASE_NO")
    })
    void updateVoToBo(SimpleUmdmodVo simpleUmdmodVo, @MappingTarget UmdmodVo umdmodVo);

    void updateBoToVo(LiaccvVo liaccvVo, @MappingTarget SimpleLiaccvVo simpleLiaccvVo);

    void updateVoToBo(SimpleLiaccvVo simpleLiaccvVo, @MappingTarget LiaccvVo liaccvVo);

    void updateVoToBo(LimSimpleVo limSimpleVo, @MappingTarget LimmodVo limmodVo);

    void updateBoToVo(LimmodVo limmodVo, @MappingTarget LimSimpleVo limSimpleVo);

    void updateBoToVo(UmdSptVo limmodVo, @MappingTarget SptUmdResponse sptUmdResponse);

    void updateVoToBo(SptUmdRequest sptUmdRequest, @MappingTarget UmdSptVo umdSptVo);

    void updateFecToRequest(FecVo fecVo, @MappingTarget CalcFeeRequest request);

    void updateRequestToYpnmod(YapinRequest yapinRequest, @MappingTarget YpnmodVo ypnmodVo);

    void updateBoToVo(YpnmodVo ypnmodVo, @MappingTarget YpnSimpleVo ypnSimpleVo);

    void updateVoToBo(YpnSimpleVo ypnSimpleVo, @MappingTarget YpnmodVo ypnmodVo);

    void updateVoToBo(OitRequest oitRequest, @MappingTarget NoticeVo noticeVo);

    DftcreVo transfer(Dftcre dftcre);

    Dftcre transfer(DftcreVo dftcreVo);

    TrtcreVo transfer(Trtcre trtcre);

    Trtcre transfer(TrtcreVo trtcreVo);

    BpdgrpVo transfer(Bpdgrp bpdgrp);

    Bpdgrp transfer(BpdgrpVo bpdgrp);

    List<SimpleCbeVo> transfer(List<Cbe> cbeList);

}
