package com.oqpo.api.web.dto.response.stinfo.item;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.oqpo.api.entity.oper.FileEntity;
import com.oqpo.api.entity.stinfo.BrandEntity;
import com.oqpo.api.entity.stinfo.ItemEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;

import java.util.List;
import java.util.stream.Collectors;


@Getter
@Setter
@Builder
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@JsonInclude(JsonInclude.Include.ALWAYS)
public class ItemInfoResponse {

    @ApiModelProperty(value = "브랜드아이디")
    private String brandId;

    @ApiModelProperty(value = "품목아이디")
    private String itemId;

    @ApiModelProperty(value = "구매단위")
    private String pchUnit;

    @ApiModelProperty(value = "구매단위명")
    private String pchUnitNm;

    @ApiModelProperty(value = "무게")
    private Float weight;

    @ApiModelProperty(value = "부피")
    private Float volume;

    @ApiModelProperty(value = "가로")
    private Float width;

    @ApiModelProperty(value = "세로")
    private Float height;

    @ApiModelProperty(value = "높이")
    private Float high;

    @ApiModelProperty(value = "무게단위")
    private String weightUnit;

    @ApiModelProperty(value = "부피단위")
    private String volumeUnit;

    @ApiModelProperty(value = "가로단위")
    private String widthUnit;

    @ApiModelProperty(value = "세로단위")
    private String heightUnit;

    @ApiModelProperty(value = "높이단위")
    private String highUnit;

    @ApiModelProperty(value = "무게단위명")
    private String weightUnitNm;

    @ApiModelProperty(value = "부피단위명")
    private String volumeUnitNm;

    @ApiModelProperty(value = "가로단위명")
    private String widthUnitNm;

    @ApiModelProperty(value = "세로단위명")
    private String heightUnitNm;

    @ApiModelProperty(value = "높이단위명")
    private String highUnitNm;


    @ApiModelProperty(value = "유통기한여부")
    private String expryYn ;

    @ApiModelProperty(value = "유통기한기간")
    private Integer expryPeriod ;

    @ApiModelProperty(value = "반품구분코드")
    private String rtnDvsn ;

    @ApiModelProperty(value = "반품구분명")
    private String rtnDvsnNm ;

    @ApiModelProperty(value = "수입구분코드")
    private String impDvsn ;

    @ApiModelProperty(value = "수입구분명")
    private String impDvsnNm ;

    @ApiModelProperty(value = "자산정보")
    private String assetInfo ;

    @ApiModelProperty(value = "재고단위")
    private String stckUnit ;

    @ApiModelProperty(value = "발주가능구분")
    private String podrPssblDvsn;

    @ApiModelProperty(value = "발주가능명")
    private String podrPssblDvsnNm;

    @ApiModelProperty(value = "구매품목여부")
    private String pchItemYn;

    @ApiModelProperty(value = "판매품목여부")
    private String saleItemYn;

    @ApiModelProperty(value = "상태코드")
    private String itemStCd;

    @ApiModelProperty(value = "상태명")
    private String itemStNm;

    @ApiModelProperty(value = "품목유형")
    private String itemType;

    @ApiModelProperty(value = "품목유형명")
    private String itemTypeNm;

    @ApiModelProperty(value = "단위")
    private String saleUnit;

    @ApiModelProperty(value = "단위명")
    private String saleUnitNm;

    @ApiModelProperty(value = "단위")
    private String unit;

    @ApiModelProperty(value = "단위명")
    private String unitNm;

    @ApiModelProperty(value = "반품가능여부")
    private String rtnPssblYn;

    @ApiModelProperty(value = "품목이미지파일번호")
    private String itemImageFileNo;

    @ApiModelProperty(value = "1박스수량")
    private Integer oneBoxQty;

    @ApiModelProperty(value = "품목분류번호")
    private String itemClassMgntNo;

    @ApiModelProperty(value = "품목분류명")
    private String itemClassNm;

    @ApiModelProperty(value = "품목분류 class1")
    private String itemClass1;

    @ApiModelProperty(value = "품목분류 class2")
    private String itemClass2;

    @ApiModelProperty(value = "품목분류 class3")
    private String itemClass3;

    @ApiModelProperty(value = "품목분류 class4")
    private String itemClass4;

    @ApiModelProperty(value = "품목분류 class1명")
    private String itemClass1Nm;

    @ApiModelProperty(value = "품목분류 class2명")
    private String itemClass2Nm;

    @ApiModelProperty(value = "품목분류 class3명")
    private String itemClass3Nm;

    @ApiModelProperty(value = "품목분류 class4명")
    private String itemClass4Nm;

    @ApiModelProperty(value = "품목이지미 파일 정보")
    private List<ItemInfoResponse.FileLogInfo> imageFileNoList;

    public static ItemInfoResponse toDTO(ItemEntity entity, List<FileEntity>  fileImageInfoList) {
        if (entity == null) return null;
        return ItemInfoResponse.builder()
                .brandId(entity.getBrandId())
                .itemId(entity.getItemId())
                .pchUnit(entity.getPchUnit() == null ? "" :entity.getPchUnit())
                .pchUnitNm(entity.getPchUnitNm() == null ? "" :entity.getPchUnitNm())
                .weight(entity.getWeight() == null ? 0 :entity.getWeight())
                .weightUnit(entity.getWeightUnit() == null ? "" :entity.getWeightUnit())
                .weightUnitNm(entity.getWeightUnitNm() == null ? "" :entity.getWeightUnitNm())
                .volume(entity.getVolume() == null ? 0 :entity.getVolume())
                .volumeUnit(entity.getVolumeUnit() == null ? "" :entity.getVolumeUnit())
                .volumeUnitNm(entity.getVolumeUnitNm() == null ? "" :entity.getVolumeUnitNm())
                .width(entity.getWidth() == null ? 0 :entity.getWidth())
                .widthUnit(entity.getWidthUnit() == null ? "" :entity.getWidthUnit())
                .widthUnitNm(entity.getWidthUnitNm() == null ? "" :entity.getWidthUnitNm())
                .height(entity.getHeight() == null ? 0 :entity.getHeight())
                .heightUnit(entity.getHeightUnit() == null ? "" :entity.getHeightUnit())
                .heightUnitNm(entity.getHeightUnitNm() == null ? "" :entity.getHeightUnitNm())
                .high(entity.getHigh() == null ? 0 :entity.getHigh())
                .highUnit(entity.getHighUnit() == null ? "" :entity.getHighUnit())
                .highUnitNm(entity.getHighUnitNm() == null ? "" :entity.getHighUnitNm())
                .expryYn (entity.getExpryYn() == null ? "" :entity.getExpryYn())
                .expryPeriod(entity.getExpryPeriod() == null ? 0 : entity.getExpryPeriod())
                .rtnDvsn (entity.getRtnDvsn() == null ? "" :entity.getRtnDvsn())
                .rtnDvsnNm (entity.getRtnDvsnNm() == null ? "" :entity.getRtnDvsnNm())
                .impDvsn (entity.getImpDvsn() == null ? "" :entity.getImpDvsn())
                .impDvsnNm (entity.getImpDvsn() == null ? "" :entity.getImpDvsn())
                .assetInfo (entity.getAssetInfo() == null ? "" :entity.getAssetInfo())
                .stckUnit (entity.getStckUnit() == null ? "" :entity.getStckUnit())
                .podrPssblDvsn(entity.getPodrPssblDvsn() == null ? "" :entity.getPodrPssblDvsn())
                .podrPssblDvsnNm(entity.getPodrPssblDvsnNm() == null ? "" :entity.getPodrPssblDvsnNm())
                .pchItemYn(entity.getPchItemYn() == null ? "" :entity.getPchItemYn())
                .saleItemYn(entity.getSaleItemYn() == null ? "" :entity.getSaleItemYn())
                .itemStCd(entity.getItemStCd() == null ? "" :entity.getItemStCd())
                .itemStNm(entity.getItemStNm() == null ? "" :entity.getItemStNm())
                .itemType(entity.getItemType() == null ? "" :entity.getItemType())
                .itemTypeNm(entity.getItemTypeNm() == null ? "" :entity.getItemTypeNm())
                .saleUnit(entity.getSaleUnit() == null ? "" :entity.getSaleUnit())
                .saleUnitNm(entity.getSaleUnitNm() == null ? "" :entity.getSaleUnitNm())
                .unit(entity.getUnit() == null ? "" :entity.getUnit())
                .unitNm(entity.getUnitNm() == null ? "" :entity.getUnitNm())
                .rtnPssblYn(entity.getRtnPssblYn() == null ? "" :entity.getRtnPssblYn())
                .itemImageFileNo(entity.getItemImageFileNo() == null ? "" :entity.getItemImageFileNo() )
                .imageFileNoList(fileImageInfoList.stream()
                        .map(m -> ItemInfoResponse.FileLogInfo.builder()
                                .fileNo(m.getFileNo())
                                .fileSeq(m.getFileSeq())
                                .filePath(m.getFilePath())
                                .fileNm(m.getFileNm())
                                .fileOrgNm(m.getFileOrgNm())
                                .build())
                        .collect(Collectors.toList()))
                .oneBoxQty(entity.getOneBoxQty() == null ? 0 :entity.getOneBoxQty())
                .itemClassMgntNo(entity.getItemClassInfo() == null ? "" : entity.getItemClassInfo().getItemClassMgntNo() == null ? "" : entity.getItemClassInfo().getItemClassMgntNo())
                .itemClassNm(entity.getItemClassMngInfo() == null ? "" : entity.getItemClassMngInfo().getItemClassNm() == null ? "" : entity.getItemClassMngInfo().getItemClassNm())
                .itemClass1(entity.getItemClassInfo() == null ? "" : entity.getItemClassInfo().getItemClass1() == null ? "" : entity.getItemClassInfo().getItemClass1())
                .itemClass2(entity.getItemClassInfo() == null ? "" : entity.getItemClassInfo().getItemClass2() == null ? "" : entity.getItemClassInfo().getItemClass2())
                .itemClass3(entity.getItemClassInfo() == null ? "" : entity.getItemClassInfo().getItemClass3() == null ? "" : entity.getItemClassInfo().getItemClass3())
                .itemClass4(entity.getItemClassInfo() == null ? "" : entity.getItemClassInfo().getItemClass4() == null ? "" : entity.getItemClassInfo().getItemClass4())
                .itemClass1Nm(entity.getItemClassInfo() == null ? "" : entity.getItemClassInfo().getItemLevel() >= 1 ? entity.getItemClassInfo().getItemClass1Nm() == null ? "" : entity.getItemClassInfo().getItemClass1Nm() : "")
                .itemClass2Nm(entity.getItemClassInfo() == null ? "" : entity.getItemClassInfo().getItemLevel() >= 2 ? entity.getItemClassInfo().getItemClass2Nm() == null ? "" : entity.getItemClassInfo().getItemClass2Nm() : "")
                .itemClass3Nm(entity.getItemClassInfo() == null ? "" : entity.getItemClassInfo().getItemLevel() >= 3 ? entity.getItemClassInfo().getItemClass3Nm() == null ? "" : entity.getItemClassInfo().getItemClass3Nm() : "")
                .itemClass4Nm(entity.getItemClassInfo() == null ? "" : entity.getItemClassInfo().getItemLevel() >= 4 ? entity.getItemClassInfo().getItemClass4Nm() == null ? "" : entity.getItemClassInfo().getItemClass4Nm() : "")
                .build();
    }

    @Getter
    @Builder
    @AllArgsConstructor(access = AccessLevel.PROTECTED)
    static class FileLogInfo {
        @ApiModelProperty(value = "파일번호")
        private String fileNo;

        @ApiModelProperty(value = "파일순번")
        private Integer fileSeq;

        @ApiModelProperty(value = "파일경로")
        private String filePath;

        @ApiModelProperty(value = "파일명")
        private String fileNm;

        @ApiModelProperty(value = "원파일명")
        private String fileOrgNm;
    }
}
