package itn.let.utl.user.service;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Random;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import itn.let.mjo.msg.service.MjonMsgService;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
import itn.let.uat.uia.web.SendLogVO;
import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.UserManageVO;


/**
*
* 관리자 로그인시 문자인증 기능에 대한 Util 클래스
* @author 사업기술본부 이준호(ITN)
* @since 2022.08.24
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
*   수정일      수정자           수정내용
*  -------    --------    ---------------------------
*   2022.08.24  이준호          최초 생성 *   
*
* </pre>
*/
@Service("MjonSmsCertSendUtil")
public class MjonSmsCertSendUtil {
	
	@Resource(name = "mjonMsgService")
	private MjonMsgService mjonMsgService;
	
	@Resource(name = "MjonMsgDataService")
	private MjonMsgDataService mjonMsgDataService;
	
	@Resource(name = "userManageService")
	private EgovUserManageService userManageService;

	/**
	* @Method Name : mjonSmsCertSend
	* @작성일 : 2022. 8. 24.
	* @작성자 :  이준호
	* @Method 설명 : 미허용 IP 관리자 페이지 로그인 시 SMS인증번호 발송
	*/
	public void mjonSmsCertSend(String callTo) throws Exception{
		MjonMsgVO mjonMsgVO = new MjonMsgVO();

		// 인증번호 내용
		String contents = "관리자 미허용 IP 문자인증 로그인 인증번호 문자입니다. 인증번호는 : %code% 입니다.";
		String code = "";
		long seed = System.currentTimeMillis();
		Random random = new Random(seed);
		// code = Integer.toString(random.nextInt(4));
		StringBuffer randomCode = new StringBuffer();
		for (int i = 0; i < 6; i++) {
			code = randomCode.append(Integer.toString(random.nextInt(10))).toString();
		}
		contents = contents.replace("%code%", code);

		mjonMsgVO.setSmsTxt(contents);
		mjonMsgVO.setReserveYn("N");
		// 시스템 문자발송 번호
		mjonMsgVO.setCallFrom("01084329333");
		mjonMsgVO.setCallTo(callTo);

		try {

			mjonMsgVO.setUserId("system");

			String msgType = "4";

			// 전송사 전송 배분
			MjonMsgVO pramVO = new MjonMsgVO();
			List<MjonMsgVO> sendRateList = mjonMsgService.selectTodayAgentSendCntList(pramVO); // 전송사 전송 배분률 및 현재 전송건수
																								// 조회
			for (MjonMsgVO tmpVO : sendRateList) {
				float cnt = Float.parseFloat(tmpVO.getMsgGroupCnt());
				float totCnt = tmpVO.getTotCnt();
				tmpVO.setSendRateInfo(Float.parseFloat(tmpVO.getSendRate()) - (cnt / totCnt * 100)); // 배분률 - 현재전송 비율
			}

			String sendAgent = sendRateList.get(0).getAgentCode();
			float maxRate = sendRateList.get(0).getSendRateInfo();
			for (MjonMsgVO tmpVO : sendRateList) { // 배분률 대비 현재전송 비율이 가장 적은거 찾기
				if (maxRate < tmpVO.getSendRateInfo()) {
					maxRate = tmpVO.getSendRateInfo();
					sendAgent = tmpVO.getAgentCode();
				}
			}

			mjonMsgVO.setMsgType("4");
			mjonMsgVO.setMsgDiv("S");	// 단문	
			
    		// 문자타입별 대표전송사 정보
			MjonMsgVO mjonMsgVO2 = new MjonMsgVO();
			mjonMsgVO2 = mjonMsgService.selectRepMsgAgetnInfo(mjonMsgVO);
			// 전송사 구분 코드 - 01 : 아이하트, 02 : 현대 퓨쳐넷, 03 : 아이엠오, 04 : 다우기술
        	mjonMsgVO.setAgentCode(mjonMsgVO2.getAgentCode()); //전송사 선택			
        	// 전송금액
			mjonMsgVO.setTotPrice(mjonMsgVO2.getAgentPrice().toString());	//총금액
			mjonMsgVO.setEachPrice(mjonMsgVO2.getAgentPrice().toString());	//한건 금액			
			
			MjonMsgReturnVO returnVO = mjonMsgDataService.insertSysMsgDataInfo(mjonMsgVO);

			// 시스템 발송 로그
			SendLogVO sendLogVO = new SendLogVO();
			// SendType 1:문자로 발송 2:이메일로 발송
			sendLogVO.setSendId(returnVO.getMsgGroupId());
			sendLogVO.setSendType("1");
			sendLogVO.setFrstSendInfo(mjonMsgVO.getCallFrom());
			sendLogVO.setReceive(mjonMsgVO.getCallTo());
			sendLogVO.setCheckNo(code);
			sendLogVO.setContents(contents);

			mjonMsgDataService.insertSysMsgLog(sendLogVO);

		} catch (Exception e) {
			System.out.println("!!!!!!!!!!!!!MjonSmsCertSendUtill - ERROR!!!!!!!!!!!!!!!!");
		}
	}
	
	/**
	* @Method Name : mjonSmsCertCheck
	* @작성일 : 2022. 8. 25.
	* @작성자 :  이준호
	* @Method 설명 : 미허용 IP 관리자 페이지 로그인 시 SMS인증번호 체크
	*/
	public String mjonSmsCertCheck(String callTo, String checkNo, String mberId) throws Exception{
		try {
			
			UserManageVO userManageVO = new UserManageVO();
			
			// userManageVO set
			userManageVO.setCheckNo(checkNo);
			userManageVO.setMoblphonNo(callTo);
			userManageVO.setEmplyrId(mberId);
			
			// SendLogVO set
			SendLogVO sendLogVO = new SendLogVO();
			sendLogVO.setReceive(userManageVO.getMoblphonNo());
	
			// 인증번호 가져오기
			sendLogVO = mjonMsgDataService.selectSysMsgLog(sendLogVO);
			if (sendLogVO == null) {
				return "empty";
			} else {
				// 시간 비교
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date nowdate = new Date();
				Date compareDate = format.parse(sendLogVO.getFrstSendPnttm());
	
				Calendar cal = Calendar.getInstance();
				cal.setTime(compareDate);
				// 5분 추가
				cal.add(Calendar.MINUTE, +5);
	
				compareDate = cal.getTime();
	
				// 인증번호을 발송한지 5분 이내일때
				if (compareDate.after(nowdate)) {
					UserManageVO checkUser = userManageService.selectAdminUserSmsCertCheck(userManageVO);
	
					if (checkUser != null) {
						return "success";
					} else {
						return "checkNoFail";
					}
				} else {
					return "timeOut";
				}
			}
	
		} catch (Exception e) {
			return "exception";
		}
	}
}
