package com.style24.batch.biz.task;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.style24.batch.biz.job.delivery.TsbDailyDeliveryZoneJob;
import com.style24.batch.biz.job.delivery.TsbDeliveryExcRcvJob;
import com.style24.batch.biz.job.delivery.TsbDeliveryOrderJob;
import com.style24.batch.biz.job.delivery.TsbDeliveryOrderRsltJob;
import com.style24.batch.biz.job.delivery.TsbInvoiceNoRcvJob;
import com.style24.batch.biz.job.delivery.TsbSoldoutCancelJob;
import com.style24.batch.biz.job.delivery.TsbSweetTrackerJob;

import lombok.extern.slf4j.Slf4j;

/**
 * 배송 Task
 * @author moon
 * @since 2020. 12. 08
 */
@Component
@Slf4j
public class TsbDeliveryTask {

	@Autowired
	private TsbDailyDeliveryZoneJob dailyDeliveryZoneJob;

	@Autowired
	private TsbDeliveryOrderJob deliveryOrderJob;

	@Autowired
	private TsbDeliveryExcRcvJob deliveryExcRcvJob;

	@Autowired
	private TsbDeliveryOrderRsltJob deliveryOrderRsltJob;

	@Autowired
	private TsbInvoiceNoRcvJob tsbInvoiceNoRcvJob;

	@Autowired
	private TsbSweetTrackerJob tsbSweetTrackerJob;

	@Autowired
	private TsbSoldoutCancelJob tsbSoldoutCancelJob;

	/**
	 * 초 분 시 일 월 주(년)
	 * 0 0 12 * * ?"             : 아무 요일, 매월, 매일 12:00:00
	 * 0 15 10 ? * *"            : 모든 요일, 매월, 아무 날이나 10:15:00
	 * 0 15 10 * * ?"            : 아무 요일, 매월, 매일 10:15:00
	 * 0 15 10 * * ? *"          : 모든 연도, 아무 요일, 매월, 매일 10:15
	 * 0 15 10 * * ?             : 2005" 2005년 아무 요일이나 매월, 매일 10:15
	 * 0 * 14 * * ?"             : 아무 요일, 매월, 매일, 14시 매분 0초
	 * 0 0/5 14 * * ?"           : 아무 요일, 매월, 매일, 14시 매 5분마다 0초
	 * 0 0/5 14,18 * * ?"        : 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초
	 * 0 0-5 14 * * ?"           : 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초
	 * 0 10,44 14 ? 3 WED"       : 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00
	 * 0 15 10 ? * MON-FRI"      : 월~금, 매월, 아무 날이나 10:15:00
	 * 0 15 10 15 * ?"           : 아무 요일, 매월 15일 10:15:00
	 * 0 15 10 L * ?"            : 아무 요일, 매월 마지막 날 10:15:00
	 * 0 15 10 ? * 6L"           : 매월 마지막 금요일 아무 날이나 10:15:00
	 * 0 15 10 ? * 6L 2002-2005" : 2002년부터 2005년까지 매월 마지막 금요일 아무 날이나 10:15:00
	 * 0 15 10 ? * 6#3"          : 매월 3번째 금요일 아무 날이나 10:15:00
	 *
	 * @throws Exception
	 */

	/**
	 * 총알배송 권역정보   : 일배치  오전 11시
	 *
	 * @throws Exception
	 */
	@Scheduled(cron = "${cron.delivery.shot.deliveryzone.refresh}")
	// @Scheduled(fixedDelay = 3500000)
	@Async
	public void shotDeliveryZoneRefreshJob() throws Exception {
		dailyDeliveryZoneJob.runById("cron.delivery.shot.deliveryzone.refresh");
	}

	/**
	 * 출고처지정 및 배송(출고)지시   : 분배치 10분??
	 *
	 * @throws Exception
	 */
	@Scheduled(cron = "${cron.delivery.loc.assign}")
	//@Scheduled(fixedDelay = 3500000)
	@Async
	public void deliveryLocAssignJob() throws Exception {
		deliveryOrderJob.runById("cron.delivery.loc.assign");
	}

	/**
	 * WMS 출고예외 수신
	 *
	 * @throws Exception
	 */
	@Scheduled(cron = "${cron.delivery.wms.outgoing.exception.receive}")
	//@Scheduled(fixedDelay = 3500000)
	@Async
	public void wmsOutgoingExceptionReceiveJob() throws Exception {
		deliveryExcRcvJob.runById("cron.delivery.wms.outgoing.exception.receive");
	}

	/**
	 * WMS 송장번호 수신  
	 *
	 * @throws Exception
	 */
	@Scheduled(cron = "${cron.delivery.wms.invoice.receive}")
	//@Scheduled(fixedDelay = 3500000)
	@Async
	public void wmsInvoiceReceiveJob() throws Exception {
		tsbInvoiceNoRcvJob.runById("cron.delivery.wms.invoice.receive");
	}
	
	/**
	 * WMS 출고결과 수신
	 *
	 * @throws Exception
	 */
	@Scheduled(cron = "${cron.delivery.wms.outgoing.result.receive}")
	//@Scheduled(fixedDelay = 3500000)
	@Async
	public void wmsOutgoingResultReceiveJob() throws Exception {
		deliveryOrderRsltJob.runById("cron.delivery.wms.outgoing.result.receive");
	}

	/**
	 * 스윗트래커  배송 추적 요청
	 *
	 * @throws Exception
	 */
	@Scheduled(cron = "${cron.delivery.sweettracker.invoice.retrieve}")
	//@Scheduled(fixedDelay = 3500000)
	@Async
	public void sweettrackerInvoiceRetrieveJob() throws Exception {
		tsbSweetTrackerJob.runById("cron.delivery.sweettracker.invoice.retrieve");
	}

	/**
	 * 자동품절취소
	 *
	 * @throws Exception
	 */
	@Scheduled(cron = "${cron.delivery.auto.soldout.cancel}")
	//@Scheduled(fixedDelay = 3500000)
	@Async
	public void autoSoldoutCancelJob() throws Exception {
		tsbSoldoutCancelJob.runById("cron.delivery.auto.soldout.cancel");
	}

}
