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.statistics.TsbDateTimeOrderStaticsJob;
import com.style24.batch.biz.job.statistics.TsbDayOrderStaticsJob;
import com.style24.batch.biz.job.statistics.TsbInflowStatisticsJob;
import com.style24.batch.biz.job.statistics.TsbInflowYesterdayStatisticsJob;
import com.style24.batch.biz.job.statistics.TsbPayStaticsJob;
import com.style24.batch.biz.job.statistics.TsbSalesSmsSendJob;
import com.style24.batch.biz.job.statistics.TsbSalesUploadJob;
import com.style24.batch.biz.job.statistics.TsbSubPayStaticsJob;

import lombok.extern.slf4j.Slf4j;

/**
 * 통계 Task
 * @author eskim
 * @since 2020. 12. 03
 */
@Component
@Slf4j
public class TsbStatisticsTask {

	@Autowired
	private TsbInflowYesterdayStatisticsJob inflowYesterdayStatisticsJob;

	@Autowired
	private TsbInflowStatisticsJob inflowStatisticsJob;

	@Autowired
	private TsbDayOrderStaticsJob dayOrderStaticsJob;

	@Autowired
	private TsbDateTimeOrderStaticsJob dateTimeOrderStaticsJob;

	@Autowired
	private TsbPayStaticsJob payStaticsJob;

	@Autowired
	private TsbSubPayStaticsJob subPayStaticsJob;

	@Autowired
	private TsbSalesSmsSendJob salesSmsSendJob;

	@Autowired
	private TsbSalesUploadJob salesUploadJob;

	/**
	 * 초 분 시 일 월 주(년)
	 * 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
	 */

	/**
	 * 사이트 제휴코드 유입집계 생성
	 *
	 * @throws Exception
	 */
	@Scheduled(cron = "${cron.statistics.aflink.inflow.create}")
	@Async
	public void aflinkInflowCreateJob() throws Exception {
		inflowStatisticsJob.runById("cron.statistics.aflink.inflow.create");
	}

	/**
	 * 사이트 제휴코드 전날 유입집계 생성
	 *
	 * @throws Exception
	 */
	@Scheduled(cron = "${cron.statistics.aflink.inflow.yesterday.create}")
	@Async
	public void aflinkInflowYesterdayCreateJob() throws Exception {
		inflowYesterdayStatisticsJob.runById("cron.statistics.aflink.inflow.yesterday.create");
	}

	/**
	 * 일간주문통계
	 */
	//@Scheduled(fixedDelay = 999999999)
	@Scheduled(cron = "${cron.statistics.order.daily.create}")
	@Async
	public void dayOrderStaticsJob() throws Exception {
		dayOrderStaticsJob.run("dayOrderStaticsJob");
		//dayOrderStaticsJob.runById("cron.statistics.order.daily.create");
	}

	/**
	 * 시간대별주문통계
	 */
	//@Scheduled(fixedDelay = 999999999)
	@Scheduled(cron = "${cron.statistics.order.datetime.create}")
	@Async
	public void dateTimeOrderStaticsJob() throws Exception {
		dateTimeOrderStaticsJob.run("dateTimeOrderStaticsJob");
		//dateTimeOrderStaticsJob.runById("cron.statistics.order.datetime.create");
	}

	/**
	 * 결제수단통계
	 */
	//@Scheduled(fixedDelay = 999999999)
	@Scheduled(cron = "${cron.statistics.pay.create}")
	@Async
	public void payStaticsJob() throws Exception {
		payStaticsJob.run("payStaticsJob");
		//payStaticsJob.runById("cron.statistics.pay.create");
	}

	/**
	 * 부결제수단통계
	 */
	//@Scheduled(fixedDelay = 999999999)
	@Scheduled(cron = "${cron.statistics.pay.sub.create}")
	@Async
	public void subPayStaticsJob() throws Exception {
		subPayStaticsJob.run("subPayStaticsJob");
		//payStaticsJob.runById("cron.statistics.pay.sub.create");
	}

	/**
	 * 매출문자 발송 (평일은 저녁 8시30분, 11시30분)
	 */
	@Scheduled(cron = "${cron.statistics.sales.sms.send1}")
	@Async
	public void sendSalesSmsJob1() throws Exception {
		salesSmsSendJob.runById("cron.statistics.sales.sms.send");
	}

	/**
	 * 매출문자 발송 (주말(토/일)은 오전 10시, 오후 2시, 6시, 저녁 10시)
	 */
	@Scheduled(cron = "${cron.statistics.sales.sms.send2}")
	@Async
	public void sendSalesSmsJob2() throws Exception {
		salesSmsSendJob.runById("cron.statistics.sales.sms.send");
	}

	/**
	 * 매출반영
	 *
	 * @throws Exception
	 */
	@Scheduled(cron = "${cron.statistics.sales.upload}")
	@Async
	public void salesUploadJob() throws Exception {
		salesUploadJob.runById("cron.statistics.sales.upload");
	}

}
