package itn.let.mjo.scheduler.service;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.sym.log.lgm.service.EgovSysLogService;

/**
 * 과거 테이블 데이터 백업 스케쥴링 클래스
 * @author 공통서비스개발팀 이삼섭
 * @since 2009.03.11
 * @version 1.0
 * @see
 *
 * <pre>
 * << 개정이력(Modification Information) >>
 *   
 *   수정일      수정자           수정내용
 *  -------    --------    ---------------------------
 *   2009.03.11  이삼섭          최초 생성
 *   2011.07.01  이기하          패키지 분리(sym.log -> sym.log.lgm)
 *   2011.08.31  JJY            경량환경 템플릿 커스터마이징버전 생성 
 *
 * </pre>
 */
@Service("tableBackupMsgScheduling")
public class TableBackupMsgScheduling{

	@Resource(name="EgovSysLogService")
	private EgovSysLogService sysLogService;

	@Resource(name="mjonMsgDataBackupService")
	private MjonMsgDataBackupService mjonMsgDataBackupService;
    
	/** 설정값 가져오기 */
	@Value("#{globalSettings['Globals.Env']}")
	private String GlobalsEnv;
	
	/**
	 * mj_msg_data 테이블 과거 데이터 백업 
	 * insert or update 처리	 
	 * @param
	 * @return
	 * @throws Exception
	 */
	public void mjMsgDataBackup() throws Exception {

		/*
		 * step0.대상 테이블 명 가져오기		ex)mj_msg_data_backup_2022
		 * 
		 * step1.작년 데이터 테이블이 있는지 확인		ex)mj_msg_data_backup_2022
		 * 		없으면 생성
		 * step2.작년 데이터를 작년 테이블로 이전	
		 * 		delete and insert	
		 * step3.제작년 데이터를 원본 테이블에서 삭제	
		 * 	ex)delete mj_msg_data(3년 이상 데이터 삭제)
		 * 	2023년인 경우 2020년 데이터 삭제
		 * 
		 * 
		 * new 2023-03-22
		 * step0.대상 테이블 명 가져오기		ex)mj_msg_data_backup_2022
		 * 
		 * step1.대상 테이블 drop 		ex)drop table mj_msg_data_backup_2022
		 * 
		 * step2.대상 테이블 생성	 		ex)create table mj_msg_data_backup_2022 LIKE mj_msg_data 
		 * 
		 * step3.대상 데이터 이전	 		ex)insert into table mj_msg_data_backup_2022 select * from mj_msg_data
		 * 
		 * step4.이전 데이터를 원본 테이블에서 삭제	
		 * 	ex)delete mj_msg_data(3년 이상 데이터 삭제)
		 * 	2023년인 경우 2020년12월31일을 포함한 이전 데이터 삭제
		 * 
		 * */
		System.out.println("=============TableBackupMsgScheduling=============mjMsgDataBackup()==============");
		
		try {
			System.out.println("=============this is =============>"+GlobalsEnv);
			
			if(!GlobalsEnv.equals("local")) {//local에서 실행 안되도록 처리	
				System.out.println("=============DO =============");
				
				MjonMsgVO mjonMsgVO = new MjonMsgVO();
								
				//step0.대상 테이블 명 가져오기		ex)mj_msg_data_2022
				//step1.대상 테이블 drop 		ex)drop table mj_msg_data_backup_2022
				//step2.대상 테이블 생성	 		ex)create table mj_msg_data_backup_2022 LIKE mj_msg_data
				//step3.대상 데이터 이전	 		ex)insert into table mj_msg_data_backup_2022 select * from mj_msg_data
				//step4.이전 데이터를 원본 테이블에서 삭제

				try {					
					//step0.대상 테이블 명 가져오기		ex)mj_msg_data_2022
					//	0.1초
					mjonMsgVO	=	mjonMsgDataBackupService.selectBackupTableName(mjonMsgVO);

					//mjonMsgVO	=	mjonMsgDataBackupService.selectBackupTable(mjonMsgVO);
					//mjonMsgDataBackupService.selectBackupTable(mjonMsgVO);
					//step1.대상 테이블 drop 		ex)drop table mj_msg_data_backup_2022
					//	
					mjonMsgDataBackupService.deleteDropTable(mjonMsgVO);
					
				}catch(Exception ex) {
					ex.printStackTrace();					
				}
				
				try {					
					//mjonMsgVO	=	mjonMsgDataBackupService.selectBackupTable(mjonMsgVO);
					//mjonMsgDataBackupService.selectBackupTable(mjonMsgVO);
					//step2.대상 테이블 생성	 		ex)create table mj_msg_data_backup_2022 LIKE mj_msg_data
					mjonMsgDataBackupService.insertCreateTableWithTableCopy(mjonMsgVO);
					
					
					//step3.대상 데이터 이전	 		ex)insert into table mj_msg_data_backup_2022 select * from mj_msg_data
					//	truncate
					//		row 4,457,123	
					//		delete time 0.625초
					//		cpu 20%~63%								
					//	insert 
					//		row 4,457,123	
					//		insert time 400초(780초)-15분 소요
					//		cpu 23%~50%			
					mjonMsgDataBackupService.deleteNinsertToBackupTable(mjonMsgVO);
					
					
					//step4.이전 데이터를 원본 테이블에서 삭제
					//* 	ex)delete mj_msg_data(3년 이상 데이터 삭제)
					//* 	2023년인 경우 2020년12월31일을 포함한 이전 데이터 삭제
					//
					//		DATE_FORMAT(sent_date,'%Y')>#rsltDate#
					//		빈데이터 삭제도 400초
					//
					//		mj_msg_data_backup_2022 테이블에서 조건으로 삭제시
					//		실제 4,457,123건 삭제시 2464초(41분) 
					//		일단위로 나눠서 삭제 365*10(초)=3650초-1시간소요
					//		
					String s_year	=	"";
					String s_month	=	"";
					String s_day	=	"";
					String s_date	=	"";
					
					s_year	=	mjonMsgVO.getRsltDate();
					
					for (int i=1;i<13;i++) {		//월
						
						
						if (i<10) {
							s_month	=	"0"	+	Integer.toString(i);
						}else {
							s_month	=	Integer.toString(i);
						}
						
						System.out.println(s_year+s_month+"=====================");
						
						for (int j=1;j<32;j++) {	//일
							if (j<10) {
								s_day	=	"0"	+	Integer.toString(j);
							}else {
								s_day	=	Integer.toString(j);
							}								
							
							s_date	=	s_year	+	s_month	+	s_day;
							System.out.println(s_date);
							
							mjonMsgVO.setRsltDate(s_date);
							mjonMsgDataBackupService.deleteToOriginTableWithDay(mjonMsgVO);
						}
					}
					//mjonMsgVO.setRsltDate(s_date);
					//mjonMsgDataBackupService.deleteToOriginTable(mjonMsgVO);
					
					
					//step0.시간 체크용
					mjonMsgVO	=	mjonMsgDataBackupService.selectBackupTableName(mjonMsgVO);
					
				}catch(Exception ex) {
					ex.printStackTrace();					
				}
				
			}else {	
				System.out.println("=============skipped!!! =============");				
			}
			// do something...
			
		}catch(Exception ex) {
			ex.printStackTrace();
		}		
	}	
}
