package com.style24.admin.biz.service;

import com.gagaframework.web.parameter.GagaMap;
import com.style24.admin.biz.dao.TsaFreegiftPromotionDao;
import com.style24.admin.support.security.session.TsaSession;
import com.style24.persistence.domain.Extmall;
import com.style24.persistence.domain.FreeGoodsPromotion;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 *상품관리 Service
 *
 * @author xodud1202
 * @since 2020. 12. 17
 */
@Service
@Slf4j
public class TsaFreegiftPromotionService {

	@Autowired
	private TsaFreegiftPromotionDao freegiftPromotionDao;

	/**
	 * 사은품 프로모션 리스트
	 * @param param
	 * @return Collection<FreeGoodsPromotion>
	 * @author xodud1202
	 * @since 2020. 12. 17
	 */
	public Collection<FreeGoodsPromotion> getFreeGoodsPromotionList(FreeGoodsPromotion param) {
		return freegiftPromotionDao.getFreeGoodsPromotionList(param);
	}

	/**
	 * 사은품 프로모션 디테일
	 * @param param
	 * @return Collection<FreeGoodsPromotion>
	 * @author xodud1202
	 * @since 2021. 01. 28
	 */
	public FreeGoodsPromotion getFreeGoodsPromotionInfo(FreeGoodsPromotion param) {
		return freegiftPromotionDao.getFreeGoodsPromotionInfo(param);
	}

	/**
	 * 사은품 프로모션 카운트
	 * @param param
	 * @return Collection<FreeGoodsPromotion>
	 * @author xodud1202
	 * @since 2020. 12. 17
	 */
	public int getFreeGoodsPromotionListCount(FreeGoodsPromotion param) {
		return freegiftPromotionDao.getFreeGoodsPromotionListCount(param);
	}

	/**
	 * 사은품 프로모션 디테일 조회
	 * @param param
	 * @return GagaMap
	 * @author xodud1202
	 * @since 2020. 12. 17
	 */
	public GagaMap getFreegiftDetailInfo(FreeGoodsPromotion param) {
		GagaMap result = new GagaMap();

		// 사은품 프로모션 마스터 정보 조회
		FreeGoodsPromotion freegift = getFreeGoodsPromotionInfo(param);
		// 상세 조회 내역이 없을경우
		if(freegift == null || freegift.getFreegiftSq() == 0 ) {
			return null;
		}

		freegift.setExtmallList(getFreegiftExtmallList(param));						// 사은품 프로모션 제휴몰 정보
		freegift.setBrandList(freegiftPromotionDao.getFreegiftBrandList(param));			// 사은품 프로모션 브랜드 정보
		freegift.setSupplyCompList(freegiftPromotionDao.getFreegiftSupplyCompList(param));	// 사은품 프로모션 공급업체 정보
		param.setGoodsGb("G800_20");
		freegift.setApplyGoodsList(freegiftPromotionDao.getFreegiftGoodsList(param));			// 사은품 프로모션 적용상품 정보
		param.setGoodsGb("G800_30");
		freegift.setExceptGoodsList(freegiftPromotionDao.getFreegiftGoodsList(param));			// 사은품 프로모션 제외상품 정보

		List<FreeGoodsPromotion> freegoodsSectionList = freegiftPromotionDao.getFreegiftSectionList(param);
		for(int i = 0 ; i < freegoodsSectionList.size() ; i++) {
			param.setFreegiftSectionSq(freegoodsSectionList.get(i).getFreegiftSectionSq());
			if(i == 0) {		// 첫번째 조건
				freegift.setSectionVal(freegoodsSectionList.get(i).getSectionVal());
				freegift.setFreeGoods1(freegiftPromotionDao.getFreegiftFreegoodsList(param));
			} else {			// 두번째 사은품 조건
				freegift.setSectionVal2(freegoodsSectionList.get(i).getSectionVal());
				freegift.setFreeGoods2(freegiftPromotionDao.getFreegiftFreegoodsList(param));
			}
		}

		result.put("freegift", freegift);
		result.put("param", param);
		return result;
	}

	/**
	 * 사은품 프로모션 제휴몰 리스트
	 * @param param
	 * @return List<Extmall>
	 * @author xodud1202
	 * @since 2020. 12. 17
	 */
	public List<Extmall> getFreegiftExtmallList(FreeGoodsPromotion param) {
		return freegiftPromotionDao.getFreegiftExtmallList(param);
	}

	/**
	 * 사은품 프로모션 정보 저장
	 * @param param
	 * @author xodud1202
	 * @since 2021. 12. 19
	 */
	@Transactional("shopTxnManager")
	public void saveFreegoodsPromotionInfo(FreeGoodsPromotion param) {
		param.setRegNo(TsaSession.getInfo().getUserNo());
		param.setUpdNo(TsaSession.getInfo().getUserNo());

		if("U".equals(param.getGbn()) && param.getFreegiftSq() != 0) {
			freegiftPromotionDao.updateFreegoodsPromotionInfo(param);	// 사은품 프로모션 정보 수정
			freegiftPromotionDao.deleteFreegiftExtmallInfo(param);		// 사은품 프로모션 제휴몰 데이터 삭제
			freegiftPromotionDao.deleteFreegiftGoodsInfo(param);		// 사은품 프로모션 적용 업체/브랜드/상품 제외상품 정보 삭제
			freegiftPromotionDao.deleteFreegiftSectionInfo(param);		// 사은품 프로모션 적용 업체/브랜드/상품 제외상품 정보 삭제
			freegiftPromotionDao.deleteFreegiftValInfo(param);			// 사은품 프로모션 적용 업체/브랜드/상품 제외상품 정보 삭제
			freegiftPromotionDao.deleteFreegiftGoodsApply(param);		// 사은품 프로모션 적용 업체/브랜드 실적용 데이터 제거
		} else {
			param.setFreegiftStat("G232_10");							// 프로모션 등록이면 대기 상태로 저장
			freegiftPromotionDao.createFreegoodsPromotionInfo(param);   // 사은품 프로모션 마스터 정보 저장
		}

		// 제휴몰 등록
		if(param.getExtmallYn() != null && "Y".equals(param.getExtmallYn()) ) {
			if(param.getExtmallList() != null && param.getExtmallList().size() > 0) {
				FreeGoodsPromotion extmallInfo = new FreeGoodsPromotion();
				extmallInfo.setFreegiftSq(param.getFreegiftSq());
				extmallInfo.setRegNo(param.getRegNo());
				extmallInfo.setUpdNo(param.getUpdNo());

				// 제휴몰 리스트만큼 반복
				for(int i = 0 ; i < param.getExtmallList().size() ; i++) {
					extmallInfo.setExtmallId(param.getExtmallList().get(i).getExtmallId());
					extmallInfo.setVendorId(param.getExtmallList().get(i).getVendorId());
					freegiftPromotionDao.createFreegiftExtmallInfo(extmallInfo);		// 제휴몰 리스트 정보 저장
				}
			}
		}

		// 공급업체 등록
		if(param.getSupplyCompList() != null && param.getSupplyCompList().size() > 0) {
			FreeGoodsPromotion supplyComp = new FreeGoodsPromotion();
			supplyComp.setFreegiftSq(param.getFreegiftSq());
			supplyComp.setGoodsGb("G800_20");			// 적용 상품 (공급업체, 브랜드, 적용 상품 3가지는 적용 상품 코드로 등록함 G800_20|적용상품, G800_30|제외상품)
			supplyComp.setTargetGb("G260_13");			// 적용 대상 (G260_10|상품, G260_12|브랜드, G260_13|공급처)
			supplyComp.setRegNo(param.getRegNo());
			supplyComp.setUpdNo(param.getUpdNo());

			// 공급업체 리스트만큼 반복
			for(int i = 0 ; i < param.getSupplyCompList().size() ; i++) {
				supplyComp.setTargetVal(param.getSupplyCompList().get(i).getSupplyCompCd());
				freegiftPromotionDao.createFreegiftGoodsInfo(supplyComp);				// 적용 공급업체 리스트 저장
			}
		}

		// 브랜드 설정 데이터 저장
		if(param.getBrandList() != null && param.getBrandList().size() > 0) {
			FreeGoodsPromotion brand = new FreeGoodsPromotion();
			brand.setFreegiftSq(param.getFreegiftSq());
			brand.setGoodsGb("G800_20");			// 적용 상품 (공급업체, 브랜드, 적용 상품 3가지는 적용 상품 코드로 등록함 G800_20|적용상품, G800_30|제외상품)
			brand.setTargetGb("G260_12");			// 적용 대상 (G260_10|상품, G260_12|브랜드, G260_13|공급처)
			brand.setRegNo(param.getRegNo());
			brand.setUpdNo(param.getUpdNo());

			// 브랜드 리스트만큼 반복
			for(int i = 0 ; i < param.getBrandList().size() ; i++) {
				brand.setTargetVal(param.getBrandList().get(i).getBrandCd());
				freegiftPromotionDao.createFreegiftGoodsInfo(brand);				// 적용 브랜드 리스트 저장
			}
		}

		// 적용 상품 데이터 저장
		if(param.getApplyGoodsList() != null && param.getApplyGoodsList().size() > 0) {
			FreeGoodsPromotion applyGoods = new FreeGoodsPromotion();
			applyGoods.setFreegiftSq(param.getFreegiftSq());
			applyGoods.setGoodsGb("G800_20");			// 적용 상품 (공급업체, 브랜드, 적용 상품 3가지는 적용 상품 코드로 등록함 G800_20|적용상품, G800_30|제외상품)
			applyGoods.setTargetGb("G260_10");			// 적용 대상 (G260_10|상품, G260_12|브랜드, G260_13|공급처)
			applyGoods.setRegNo(param.getRegNo());
			applyGoods.setUpdNo(param.getUpdNo());

			// 브랜드 리스트만큼 반복
			for(int i = 0 ; i < param.getApplyGoodsList().size() ; i++) {
				applyGoods.setTargetVal(param.getApplyGoodsList().get(i).getGoodsCd());
				freegiftPromotionDao.createFreegiftGoodsInfo(applyGoods);			// 적용 상품 리스트 저장
			}
		}

		// 제외 상품 데이터 저장
		if(param.getExceptGoodsList() != null && param.getExceptGoodsList().size() > 0) {
			FreeGoodsPromotion exceptGoods = new FreeGoodsPromotion();
			exceptGoods.setFreegiftSq(param.getFreegiftSq());
			exceptGoods.setGoodsGb("G800_30");			// 적용 상품 (공급업체, 브랜드, 적용 상품 3가지는 적용 상품 코드로 등록함 G800_20|적용상품, G800_30|제외상품)
			exceptGoods.setTargetGb("G260_10");			// 적용 대상 (G260_10|상품, G260_12|브랜드, G260_13|공급처)
			exceptGoods.setRegNo(param.getRegNo());
			exceptGoods.setUpdNo(param.getUpdNo());

			// 적용 상품 리스트만큼 반복
			for(int i = 0 ; i < param.getExceptGoodsList().size() ; i++) {
				exceptGoods.setTargetVal(param.getExceptGoodsList().get(i).getGoodsCd());
				freegiftPromotionDao.createFreegiftGoodsInfo(exceptGoods);			// 적용 상품 리스트 저장
			}
		}

		// 사은품 조건1 사은품 존재 여부 및 구매금액 제한 조건 체크
		if(param.getFreeGoods1() != null && param.getFreeGoods1().size() > 0 && param.getSectionVal() > 0) {
			// 사은품 지급조건 Section 저장
			FreeGoodsPromotion freegoodsGiveInfo = new FreeGoodsPromotion();
			freegoodsGiveInfo.setFreegiftSq(param.getFreegiftSq());
			freegoodsGiveInfo.setSectionGb("G810_11");				// 사은품 프로모션 구간 설정 구분값 (G810_10|수량, G810_11|금액)  >>  사은품 프로모션 기획서상 금액 구분만 존재함.
			freegoodsGiveInfo.setSectionVal(param.getSectionVal());	// 사은품조건 section1 구매금액 조건
			freegoodsGiveInfo.setRegNo(param.getRegNo());
			freegoodsGiveInfo.setUpdNo(param.getUpdNo());
			freegiftPromotionDao.createFreegiftSectionInfo(freegoodsGiveInfo);	// 사은품 지급 조건 영역 저장

			// 지급 사은품 리스트1 반복
			for (int i = 0 ; i < param.getFreeGoods1().size() ; i++) {
				freegoodsGiveInfo.setProductNo(param.getFreeGoods1().get(i).getProductNo());		// 사은품 번호
				freegoodsGiveInfo.setUsePoint(param.getFreeGoods1().get(i).getUsePoint());			// 사은품 포인트액
				freegoodsGiveInfo.setItemQty(param.getFreeGoods1().get(i).getItemQty());			// 주문시 지급 수량
				freegoodsGiveInfo.setLimitQty(param.getFreeGoods1().get(i).getLimitQty());			// 한정 수량
				freegoodsGiveInfo.setLeftQty(param.getFreeGoods1().get(i).getLimitQty());			// 잔여 수량

				freegiftPromotionDao.createPromotionFreeGoodsInfo(freegoodsGiveInfo);	// 사은품 지급 상품 영역 저장
			}
		}

		// 사은품 조건2 사은품 존재 여부 및 구매금액 제한 조건 체크
		if(param.getFreeGoods2() != null && param.getFreeGoods2().size() > 0 && param.getSectionVal2() > 0) {
			// 사은품 지급조건 Section 저장
			FreeGoodsPromotion freegoodsGiveInfo = new FreeGoodsPromotion();
			freegoodsGiveInfo.setFreegiftSq(param.getFreegiftSq());
			freegoodsGiveInfo.setSectionGb("G810_11");					// 사은품 프로모션 구간 설정 구분값 (G810_10|수량, G810_11|금액)  >>  사은품 프로모션 기획서상 금액 구분만 존재함.
			freegoodsGiveInfo.setSectionVal(param.getSectionVal2());	// 사은품조건 section2 구매금액 조건
			freegoodsGiveInfo.setRegNo(param.getRegNo());
			freegoodsGiveInfo.setUpdNo(param.getUpdNo());
			freegiftPromotionDao.createFreegiftSectionInfo(freegoodsGiveInfo);	// 사은품 지급 조건 영역 저장

			// 지급 사은품 리스트2 반복
			for (int i = 0 ; i < param.getFreeGoods2().size() ; i++) {
				freegoodsGiveInfo.setProductNo(param.getFreeGoods2().get(i).getProductNo());		// 사은품 번호
				freegoodsGiveInfo.setUsePoint(param.getFreeGoods2().get(i).getUsePoint());			// 사은품 포인트액
				freegoodsGiveInfo.setItemQty(param.getFreeGoods2().get(i).getItemQty());			// 주문시 지급 수량
				freegoodsGiveInfo.setLimitQty(param.getFreeGoods2().get(i).getLimitQty());			// 한정 수량
				freegoodsGiveInfo.setLeftQty(param.getFreeGoods2().get(i).getLimitQty());			// 잔여 수량

				freegiftPromotionDao.createPromotionFreeGoodsInfo(freegoodsGiveInfo);	// 사은품 지급 상품 영역 저장
			}
		}

		// 공급업체 / 브랜드 실 사용 테이블 저장
		if(param.getSupplyCompList() != null && param.getSupplyCompList().size() > 0 && param.getBrandList() != null && param.getBrandList().size() > 0) {
			freegiftPromotionDao.insertFreegiftGoodsApplyList(param);
		} else if (param.getSupplyCompList() != null && param.getSupplyCompList().size() > 0) {
			FreeGoodsPromotion company = new FreeGoodsPromotion();
			company.setFreegiftSq(param.getFreegiftSq());
			company.setTargetGb("G260_13");		// 적용 대상 (G260_10|상품, G260_12|브랜드, G260_13|공급처)
			company.setRegNo(param.getRegNo());
			freegiftPromotionDao.insertFreegiftGoodsApplyList(company);	// 등록된 업체 코드 등록
			freegiftPromotionDao.insertFreegiftGoodsApplyCompanyOrBrandList(company);
		} else if (param.getBrandList() != null && param.getBrandList().size() > 0) {
			FreeGoodsPromotion brand = new FreeGoodsPromotion();
			brand.setFreegiftSq(param.getFreegiftSq());
			brand.setTargetGb("G260_12");		// 적용 대상 (G260_10|상품, G260_12|브랜드, G260_13|공급처)
			brand.setRegNo(param.getRegNo());
			freegiftPromotionDao.insertFreegiftGoodsApplyList(brand);	// 등록된 업체 코드 등록
			freegiftPromotionDao.insertFreegiftGoodsApplyCompanyOrBrandList(brand);
		}

	}

	/**
	 * 사은품 프로모션 명 변경
	 * @param param
	 * @author xodud1202
	 * @since 2021. 05. 04
	 */
	@Transactional("shopTxnManager")
	public void saveFreegoodsPromotionNameInfo(FreeGoodsPromotion param) {
		if(StringUtils.isEmpty(param.getFreegiftNm()) || param.getFreegiftSq() < 1) {
			throw new IllegalArgumentException("사은품 프로모션 정보 저장 실패하였습니다. 새로고침 후 다시 시도해주세요.");
		} else {
			param.setUpdNo(TsaSession.getInfo().getUserNo());
			freegiftPromotionDao.updateFreegoodsPromotionName(param);
		}
	}

	/**
	 * 사은품 프로모션 상태 수정
	 * @param param
	 * @author xodud1202
	 * @since 2021. 12. 20
	 */
	@Transactional("shopTxnManager")
	public void updateFreegoodsPromotionStat(FreeGoodsPromotion param) {
		param.setUpdNo(TsaSession.getInfo().getUserNo());
		freegiftPromotionDao.updateFreegoodsPromotionStat(param);
	}
}
