package com.style24.batch.biz.job.delivery;

import java.util.Collection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.style24.batch.biz.job.TsbAbstractJob;
import com.style24.batch.biz.service.TsbDeliveryService;
import com.style24.batch.biz.service.TsbWmsDeliveryService;
import com.style24.core.support.env.TscConstants;
import com.style24.persistence.domain.Delivery;
import com.style24.persistence.domain.WmsDelivery;

import lombok.extern.slf4j.Slf4j;

/**
 * 출고처지정 및 배송(출고)지시 (mall to wmsif) 
 *
 * @author moon
 * @since 2021. 01. 29
 */
@Component
@Slf4j
public class TsbDeliveryOrderJob extends TsbAbstractJob<Collection<Delivery>, Collection<Delivery>, Collection<Delivery>> {

	@Autowired
	private TsbDeliveryService deliveryService;

	@Autowired
	private TsbWmsDeliveryService wmsDeliveryService;

	private int succCnt = 0;
	private int failCnt = 0;

	@Override
	public Collection<Delivery> read() throws Exception {

		// 1. 출고처지정 대상조회 
		Collection<Delivery> ordnoList = deliveryService.getOrderNoList();
		return ordnoList;
	}

	@Override
	public Collection<Delivery> process(Collection<Delivery> ordnoList) throws Exception {
		succCnt = 0;
		failCnt = 1;

		/**
		 * 1. 출고처지정 대상조회 
		 * 
		 * 2. WMS 재고체크 후  주문의상품재고가  다 있을경우 WMS로 출고처지정 
		 * 
		 * 3. WMS의  주문단위 상품재고가 없을경우  매장재고 체크 후  주문단위 상품이 모두있을경우 해당 매장으로 출고처 지정 
		 * 
		 * 4. 주문상품의 모든재고가 (WMS, 매장) 모두 없을경우  WMS로 출고처지정 (부분배송) 이때 교환은  교환출고예외 테이블에 등록(tb_exchange_delv_fail)
		 * 
		 * 5. 출고처 WMS 리스트 조회 후  WMS_IF 테이블에 등록   
		 * 
		 * */

		String ShopYn = "N";
		String WmsYn = "N";

		// WMS 창고 출고처 지정 
		for (Delivery ordNoData : ordnoList) {
			try {
				ShopYn = "N";
				WmsYn = "N";
				//2. WMS 재고체크 후  주문의상품재고가  다 있을경우 WMS로 출고처지정 
				// 주문상세번호 조회  
				Collection<Delivery> ordDtlNoList = deliveryService.getOrderDtlNoList(ordNoData);
				int ordDtlCnt = 0;
				for (Delivery ordDtlNoData : ordDtlNoList) {

					// 주문상세아이템 조회  
					Collection<Delivery> itemList = deliveryService.getOrderDtlItemList(ordDtlNoData);
					int chkCnt = 0;
					for (Delivery item : itemList) {
						// WMS 재고체크 
						WmsDelivery wmsStock = deliveryService.getWmsRealStockChk(item);
						if (wmsStock != null) {
							if (wmsStock.getLocQty() >= item.getOrdQty()) {
								chkCnt = chkCnt + 1;
							}
						}
					}
					if (chkCnt == itemList.size()) {
						ordDtlCnt = ordDtlCnt + 1;
					}
				}
				log.info("ordDtlCnt" + ordDtlCnt + "  ordDtlNoList.size() " + ordDtlNoList.size());
				if (ordDtlCnt == ordDtlNoList.size()) {
					for (Delivery inOrdDtlNoData : ordDtlNoList) {
						inOrdDtlNoData.setDelvLocCd(TscConstants.WMS_DELV_LOC_CD);

						// 출고처등록  및 history 등록   (TB_DELIVERY_ASSIGN & TB_DELIVERY_ASSIGN_HST) 
						// log.info("WMS 창고 출고처 지정  DTL_NO"+ inOrdDtlNoData.getOrdDtlNo());
						inOrdDtlNoData.setDelvArGb("Y"); // 수락  
						inOrdDtlNoData.setLocQty(inOrdDtlNoData.getOrdQty());
						deliveryService.saveDeliveryAssign(inOrdDtlNoData);

						// 주문상태변경 및 출고처코드 등록 (TB_ORDER_DETAIL & TB_ORDER_DETAIL_HST)
						inOrdDtlNoData.setOrdDtlStat("G013_35");  // 출고처지정 
						inOrdDtlNoData.setDelvAssignStat("Y");    // 출고처지정상태 
						deliveryService.updateTbOrderDtlAssign(inOrdDtlNoData);

						Collection<Delivery> itemList = deliveryService.getOrderDtlItemList(inOrdDtlNoData);
						// wms 재고차감 등록(TB_SELL_QTY)  
						for (Delivery data : itemList) {
							wmsDeliveryService.insertWmsTbIfDelifixQty(data);
						}
					}
					WmsYn = "N";
				} else {
					ShopYn = "Y";
				}

				// 3. WMS의  주문단위 상품재고가 없을경우  매장재고 체크 후  주문단위 상품이 모두있을경우 해당 매장으로 출고처 지정  
				// WMS 창고 출고처 지정 못한 주문건이 존재  매장 출고처 지정
				/*
				if ("Y".equals(ShopYn) && "N".equals(ordNoData.getGiftyn())) {

					Collection<Delivery> shopOrdDtlNoList = deliveryService.getOrderDtlNoList(ordNoData);

					// 출고처지정 임시 테이블 초기화 
					deliveryService.deleteTbDeliveryLocTmp();

					for (Delivery shopOrdDtlNoData : shopOrdDtlNoList) {

						// 주문상세아이템 조회  
						Collection<Delivery> shopItemList = deliveryService.getOrderDtlItemList(shopOrdDtlNoData);

						if ("G056_S".equals(shopOrdDtlNoData.getGoodsType())) {
							deliveryService.getShopRealStockSetChk(shopItemList, shopOrdDtlNoData.getOrdDtlNo());
						} else {
							deliveryService.getShopRealStockChk(shopItemList);
						}
					}

					// 출고처지정 임시테이블 조회 
					int toTalOrdDtlCnt = shopOrdDtlNoList.size();
					Delivery temp = deliveryService.getDeliveryLocTmp(toTalOrdDtlCnt);
					if (temp != null) {
						if (toTalOrdDtlCnt == temp.getGoodsLocCnt()) {
							String[] ordDtlNoArr = temp.getOrdDtlNoList().split(",");
							for (int j = 0; j < ordDtlNoArr.length; j++) {

								// 출고처등록  및 history 등록   (TB_DELIVERY_ASSIGN & TB_DELIVERY_ASSIGN_HST) 
								Delivery saveData = new Delivery();
								saveData.setOrdNo(ordNoData.getOrdNo());
								saveData.setOrdDtlNo(Integer.parseInt(ordDtlNoArr[j]));
								saveData.setDelvLocCd(temp.getDelvLocCd());
								saveData.setLocQty(temp.getLocQty());

								saveData.setDelvArGb("P"); // 대기  
								deliveryService.saveDeliveryAssign(saveData);

								// 주문상태변경 및 출고처코드 등록 (TB_ORDER_DETAIL & TB_ORDER_DETAIL_HST)
								saveData.setOrdDtlStat("G013_35");  // 출고처지정 
								saveData.setDelvAssignStat("P");    // 출고처지정상태 
								deliveryService.updateTbOrderDtlAssign(saveData);

							}

						} else {
							WmsYn = "Y";
							ShopYn = "N";
						}
					} else {
						WmsYn = "Y";
						ShopYn = "N";
					}

				}
				*/
				WmsYn = "Y"; // 직송매장 적용시 삭제 
				// 4. 주문상품의 모든재고가 (WMS, 매장) 모두 없을경우  WMS로 출고처지정 (부분배송) 이때 교환은  교환출고예외 테이블에 등록(tb_exchange_delv_fail)
				if ("Y".equals(WmsYn)) {
					if ("E".equals(ordNoData.getOrdExchGb())) {
						Collection<Delivery> ordDtlNoWmsList = deliveryService.getOrderDtlNoList(ordNoData);
						for (Delivery chgData : ordDtlNoWmsList) {
							// 주문상세아이템 조회  
							Collection<Delivery> itemList = deliveryService.getOrderDtlItemList(chgData);
							int chkCnt = 0;
							for (Delivery item : itemList) {
								// WMS 재고체크 
								WmsDelivery wmsStock = deliveryService.getWmsRealStockChk(item);
								if (wmsStock != null) {
									if (wmsStock.getLocQty() >= item.getOrdQty()) {
										chkCnt = chkCnt + 1;
									}
								}
							}

							//chgData.setRegNo(regNo);
							chgData.setCnclRtnQty(chgData.getOrdQty() - chkCnt); // 취소수량(재고없는수량) 
							// insert 
							deliveryService.insertTbExchangeDelvFail(chgData);

							// ddddd
						}

					} else {
						if ("NAVER_ORDER".equals(ordNoData.getPgGb())) { // 네이버 주문형

							// 주문상세번호 조회  
							Collection<Delivery> ordDtlNoWmsList = deliveryService.getOrderDtlNoList(ordNoData);

							for (Delivery wmsOrdDtlData : ordDtlNoWmsList) {
								// 주문상세아이템 조회  
								Collection<Delivery> itemList = deliveryService.getOrderDtlItemList(wmsOrdDtlData);
								int chkCnt = 0;
								for (Delivery item : itemList) {
									// WMS 재고체크 
									WmsDelivery wmsStock = deliveryService.getWmsRealStockChk(item);
									if (wmsStock != null) {
										if (wmsStock.getLocQty() >= item.getOrdQty()) {
											chkCnt = chkCnt + 1;
										}
									}
								}

								if (chkCnt >= itemList.size()) {
									wmsOrdDtlData.setDelvLocCd(TscConstants.WMS_DELV_LOC_CD);

									// 출고처등록  및 history 등록   (TB_DELIVERY_ASSIGN & TB_DELIVERY_ASSIGN_HST) 

									//log.info("네이버주문형Y  DTL_NO"+ wmsOrdDtlData.getOrdDtlNo());
									wmsOrdDtlData.setDelvArGb("Y"); // 수락  
									wmsOrdDtlData.setLocQty(wmsOrdDtlData.getOrdQty());
									deliveryService.saveDeliveryAssign(wmsOrdDtlData);

									// 주문상태변경 및 출고처코드 등록 (TB_ORDER_DETAIL & TB_ORDER_DETAIL_HST)
									wmsOrdDtlData.setOrdDtlStat("G013_35");  // 출고처지정 
									wmsOrdDtlData.setDelvAssignStat("Y");    // 출고처지정상태 
									deliveryService.updateTbOrderDtlAssign(wmsOrdDtlData);

									// wms 재고차감 등록(TB_SELL_QTY)  
									for (Delivery data : itemList) {
										wmsDeliveryService.insertWmsTbIfDelifixQty(data);
									}
								} else {
									// 출고처등록  및 history 등록   (TB_DELIVERY_ASSIGN & TB_DELIVERY_ASSIGN_HST) 
									log.info("네이버주문형N   DTL_NO" + wmsOrdDtlData.getOrdDtlNo());
									wmsOrdDtlData.setDelvLocCd(TscConstants.WMS_DELV_LOC_CD);
									wmsOrdDtlData.setDelvArGb("N"); // 수락  
									wmsOrdDtlData.setLocQty(wmsOrdDtlData.getOrdQty());
									deliveryService.saveDeliveryAssign(wmsOrdDtlData);
								}
							}
						} else { // 일반 
							//log.info("last:"+ordNoData.getOrdNo());
							// 주문상세번호 조회  
							Collection<Delivery> ordDtlNoWmsList = deliveryService.getOrderDtlNoList(ordNoData);
							int chkCnt = 0;
							for (Delivery wmsOrdDtlData : ordDtlNoWmsList) {

								if ("G056_S".equals(wmsOrdDtlData.getGoodsType())) {

									// 주문상세아이템 조회  
									int setCnt = 0;
									Collection<Delivery> itemList = deliveryService.getOrderDtlItemList(wmsOrdDtlData);

									for (Delivery item : itemList) {
										// WMS 재고체크 
										WmsDelivery wmsStock = deliveryService.getWmsRealStockChk(item);
										if (wmsStock != null) {
											if (wmsStock.getLocQty() >= item.getOrdQty()) {
												setCnt = setCnt + 1;
											}
										}
									}
									if (setCnt == itemList.size()) {
										chkCnt = chkCnt + 1;
									}
								} else {
									// 주문상세아이템 조회  
									Collection<Delivery> itemList = deliveryService.getOrderDtlItemList(wmsOrdDtlData);

									for (Delivery item : itemList) {
										// WMS 재고체크 
										WmsDelivery wmsStock = deliveryService.getWmsRealStockChk(item);
										if (wmsStock != null) {
											if (wmsStock.getLocQty() >= item.getOrdQty()) {
												chkCnt = chkCnt + 1;
											}
										}
									}
								}

							}
							if (chkCnt > 0) {
								for (Delivery wmsOrdDtlData : ordDtlNoList) {

									// log.info("라스트  N   DTL_NO"+ wmsOrdDtlData.getOrdDtlNo());
									wmsOrdDtlData.setDelvLocCd(TscConstants.WMS_DELV_LOC_CD);
									// 출고처등록  및 history 등록   (TB_DELIVERY_ASSIGN & TB_DELIVERY_ASSIGN_HST) 
									wmsOrdDtlData.setDelvArGb("Y"); // 수락  
									wmsOrdDtlData.setLocQty(wmsOrdDtlData.getOrdQty());
									deliveryService.saveDeliveryAssign(wmsOrdDtlData);

									// 주문상태변경 및 출고처코드 등록 (TB_ORDER_DETAIL & TB_ORDER_DETAIL_HST)
									wmsOrdDtlData.setOrdDtlStat("G013_35");  // 출고처지정 
									wmsOrdDtlData.setDelvAssignStat("Y");    // 출고처지정상태 
									deliveryService.updateTbOrderDtlAssign(wmsOrdDtlData);

									// 주문상세아이템 조회  
									Collection<Delivery> itemList = deliveryService.getOrderDtlItemList(wmsOrdDtlData);
									// wms 재고차감 등록(TB_SELL_QTY)  
									for (Delivery data : itemList) {
										wmsDeliveryService.insertWmsTbIfDelifixQty(data);
									}
								}
							} else {
								for (Delivery wmsOrdDtlData : ordDtlNoList) {
									// log.info("라스트  N   DTL_NO"+ wmsOrdDtlData.getOrdDtlNo());

									wmsOrdDtlData.setDelvLocCd(TscConstants.WMS_DELV_LOC_CD);
									// 출고처등록  및 history 등록   (TB_DELIVERY_ASSIGN & TB_DELIVERY_ASSIGN_HST) 
									wmsOrdDtlData.setDelvArGb("N"); // 거절
									wmsOrdDtlData.setLocQty(wmsOrdDtlData.getOrdQty());
									deliveryService.saveDeliveryAssign(wmsOrdDtlData);
								}
							}
						}
					}
				}
			} catch (Exception e) {
				log.debug("TsbDeliveryOrderJob " + e.getStackTrace().toString());
			}
		} // for(Delivery ordNoData : ordnoList)

		// 5. 출고처 WMS 리스트 조회 후  WMS_IF 테이블에 등록   
		// wms 출고처 지정 대상 조회 
		// 사은품 조회  차후 작업!!!! 
		Collection<Delivery> ordList = deliveryService.getWmsDeliveryOrdNoList();
		for (Delivery ordData : ordList) {
			try {
				// wms 출고 정보 조회(mall_DB) 
				Collection<Delivery> wmsDelvList = deliveryService.getWmsDeliveryList(ordData);
				Collection<Delivery> giftList = deliveryService.getWmsDeliveryGiftList(ordData);
				// wms 출고 정보 등록 (wms_DB)
				wmsDeliveryService.insertWmsDelivery(wmsDelvList, giftList);

				// 주문상세상태 변경  상품준비중~
				String statGb = "PREPARE";
				deliveryService.updateTbOrderDtlStat(wmsDelvList, statGb);
			} catch (Exception e) {
				log.debug("TsbDeliveryOrderJob insertWmsDelivery " + e.getStackTrace().toString());
			}
		}

		succCnt = 1;
		failCnt = 0;

		return ordnoList;
	}

	@Override
	public Collection<Delivery> write(Collection<Delivery> delivery) throws Exception {

		return delivery;
	}

	@Override
	public void notify(Collection<Delivery> delivery) throws Exception {
		super.printResult(succCnt, failCnt);
	}

}