package itn.let.uat.uia.web;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;
import java.util.Random;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.ui.ModelMap;

import com.icert.comm.secu.IcertSecuManager;

import itn.let.cert.phone.service.CertPhoneService;
import itn.let.cert.phone.service.MberCertPhoneVO;
import itn.let.uat.uia.service.AuthCertVO;
import itn.let.uss.umt.service.MberManageVO;

@Component("KmcCertChecker")
public class KmcCertChecker {
	
	@Resource(name = "CertPhoneService")
	private CertPhoneService certPhoneService;

	//회원가입 시 인증수단을 휴대폰 본인인증만 했을 경우 사용
	public AuthCertVO authCertCheck(
								MberCertPhoneVO mberCertPhoneVO
								, HttpServletRequest request
							) {
		//url 세팅
		mberCertPhoneVO = setMberCertPhoneVO(request, mberCertPhoneVO);
		
		//kmc step 01 데이터
		//reqNum은 최대 40byte 까지 사용 가능
        String reqNum = getDay() + getRanNum(); //요청번호
        
        String tr_cert       = "";
        String cpId          = "MJOM1001";        // 회원사ID
        String urlCode       = mberCertPhoneVO.getUrlCode();     // URL코드
        String certNum       = reqNum;     // 요청번호 ( 본인인증 요청시 중복되지 않게 생성해야함. (예-시퀀스번호) )
        String date          = getDay();        // 요청일시
        String certMet       = "M";     // 본인인증방법 - M:휴대폰 본인인증, C:신용카드인증, P:공인인증서 인증 
        
        
//        String name          = "";        // 성명
        String name          = mberCertPhoneVO.getName();        // 성명
        String phoneNo	     = mberCertPhoneVO.getPhoneNo();	    // 휴대폰번호
        String phoneCorp     = mberCertPhoneVO.getPhoneCorp();   // 이동통신사
    	if(phoneCorp == null) phoneCorp = "";
    	String birthDay	     = mberCertPhoneVO.getBirthDay();	// 생년월일
    	String gender	     = mberCertPhoneVO.getGender();		// 성별
    	if(gender == null) gender = "";
        String nation        = mberCertPhoneVO.getNation();      // 내외국인 구분 - 0:내국인, 1:외국인 
    	String plusInfo      = mberCertPhoneVO.getPlusInfo();	// 추가DATA정보
    	
    	
    	String extendVar     = "0000000000000000";                  // 확장변수
        //End-tr_cert 데이터 변수 선언 ---------------------------------------------------------------

    	String tr_url     = getDomain(request) + mberCertPhoneVO.getTrUrl();// // 본인인증서비스 결과수신 POPUP URL
    	String tr_add     = "N";         // IFrame사용여부
        
    	//01. 한국모바일인증(주) 암호화 모듈 선언
    	IcertSecuManager seed  = new IcertSecuManager();

		//02. 1차 암호화 (tr_cert 데이터변수 조합 후 암호화)
		String enc_tr_cert = "";
		tr_cert            = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"/"+ birthDay +"/"+ gender +"/"+ name +"/"+ phoneNo +"/"+ phoneCorp +"/"+ nation +"/"+ plusInfo +"/"+ extendVar;
		enc_tr_cert        = seed.getEnc(tr_cert, "");

		//03. 1차 암호화 데이터에 대한 위변조 검증값 생성 (HMAC)
		String hmacMsg = "";
		hmacMsg = seed.getMsg(enc_tr_cert);

		//04. 2차 암호화 (1차 암호화 데이터, HMAC 데이터, extendVar 조합 후 암호화)
		tr_cert  = seed.getEnc(enc_tr_cert + "/" + hmacMsg + "/" + extendVar, "");
		
		AuthCertVO authCertVO = new AuthCertVO();
		
		authCertVO.setTr_cert(tr_cert);
		authCertVO.setTr_url(tr_url);
		authCertVO.setTr_add(tr_add);
		
		return authCertVO;
	}
	
	
	
	private String getDomain(HttpServletRequest request) {
		String serverNm = request.getScheme() + "://" + request.getServerName();
		if(request.getServerPort() != 80
			&& request.getServerPort() != 443) {
			serverNm += ":" + request.getServerPort();
		}
		
		return serverNm;
	}
	
	private String getDay() {
		Calendar today = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String day = sdf.format(today.getTime());
        
        return day;
	}
	
	private String getRanNum() {
		Random ran = new Random();
        //랜덤 문자 길이
        int numLength = 6;
        String randomStr = "";

        for (int i = 0; i < numLength; i++) {
            //0 ~ 9 랜덤 숫자 생성
            randomStr += ran.nextInt(10);
        }
        
        return randomStr;
	}
	
	private MberCertPhoneVO setMberCertPhoneVO(
													HttpServletRequest request
													, MberCertPhoneVO mberCertPhoneVO
												) {
		mberCertPhoneVO.setUrl(mberCertPhoneVO.getTrUrl());
		mberCertPhoneVO.setHost(getDomain(request));
		
		MberCertPhoneVO tmpMberCertPhoneVO = new MberCertPhoneVO();
		try {
			tmpMberCertPhoneVO = certPhoneService.selectCertUrlCode(mberCertPhoneVO);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
		if(tmpMberCertPhoneVO != null) {
			mberCertPhoneVO.setUrl(tmpMberCertPhoneVO.getUrl());
			mberCertPhoneVO.setHost(tmpMberCertPhoneVO.getHost());
			mberCertPhoneVO.setUrlCode(tmpMberCertPhoneVO.getUrlCode());
		}
		
		return mberCertPhoneVO;
	}
	
	
}
