package itn.let.mjo.mjocommon;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.json.simple.JSONObject;
import org.springframework.stereotype.Service;

import com.mysql.jdbc.StringUtils;

import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.mjo.msg.service.MjonMsgVO;

@Service("MjonCommon")
public class MjonCommon {
	
	//Slack Web Hook URL
	private String url = "https://hooks.slack.com/services/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";
	
	/**
	* @throws Exception 
	 * @Method Name : getAdminSlackSand
	* @작성일 : 2022. 12. 6.
	* @작성자 :  WYH
	* @Method 설명 : slack 메시지 전송
	*/
	@SuppressWarnings("unchecked")
	public void getAdminSandSlack(MjonMsgVO mjonMsgVO) {
		
		HttpClient client = new HttpClient();
		PostMethod post = new PostMethod(url);
		JSONObject json = new JSONObject();
		try {
 
			String reserveYn = mjonMsgVO.getReserveYn();
			String delayYn = mjonMsgVO.getDelayYn();
			String smsTxt = mjonMsgVO.getSmsTxt();
			String smishingYn = mjonMsgVO.getSmishingYn();
			String reservSmsTxt = "";
			String smisingSmsTxt = "";
			//예약문자를 발송하는 경우 문자 내용 앞에 "[예약]" 표시되도록 처리
			if(reserveYn.equals("Y")) {
				
				if(smishingYn.equals("Y") || delayYn.equals("Y")) {
					reservSmsTxt = "[스미싱의심][예약]" + smsTxt;
				}else {
					reservSmsTxt = "[예약]" + smsTxt;
				}
				
				smsTxt = reservSmsTxt;
			}else if(smishingYn.equals("Y") || delayYn.equals("Y")) {
				
				smisingSmsTxt = "[스미싱의심]" + smsTxt;
				smsTxt = smisingSmsTxt;
			}
			
			String sandName = mjonMsgVO.getCallFrom();
			String userId = mjonMsgVO.getUserId();
			String msgType = "";
			int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt());//그림 이미지 갯수
			if(mjonMsgVO.getMsgType().equals("4")) {	//단문 금액
				msgType = "[단문]";
			}else if(mjonMsgVO.getMsgType().equals("6")){
				if(fileCount == 0) {
					msgType = "[장문]";	
				}else {
					msgType = "[그림]";
					// 2022.12.21 JSP => 텍스트없는 그림문자만 발송시 슬랙알림 안됨
					if (StringUtils.isNullOrEmpty(smsTxt)) {
						smsTxt = "그림문자 " + smsTxt;
					}
				}
			}
			sandName = "[" + userId + "]" + "[" + sandName + "]" + msgType;
			
			json.put("channel", "mjon메시지");
			json.put("text", smsTxt);
			json.put("username", sandName);
			
			
			post.addParameter("payload", json.toString());
			// 처음에 utf-8로 content-type안넣어주니까 한글은 깨져서  content-type넣어줌
			post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			int responseCode = client.executeMethod(post);
			String response = post.getResponseBodyAsString();
			if (responseCode != HttpStatus.SC_OK) { 
				System.out.println("Response: " + response);
			}
		} catch (IllegalArgumentException e) {
			System.out.println("IllegalArgumentException posting to Slack " + e);
		} catch (IOException e) {
			System.out.println("IOException posting to Slack " + e);
		} catch (Exception e) {
			System.out.println("Exception posting to Slack " + e);
		} finally {
			post.releaseConnection();
		}
		
	}
	
	
	/**
	* @Method Name : sendSimpleSlackMsg
	* @작성일 : 2022. 12. 9
	* @작성자 :  AnJooYoung
	* @Method 설명 : slack 단순 메시지 전송
	*/
	@SuppressWarnings("unchecked")
	public void sendSimpleSlackMsg(String msg) {
		
		HttpClient client = new HttpClient();
		PostMethod post = new PostMethod(url);
		JSONObject json = new JSONObject();
		try {
			
			json.put("channel", "mjon메시지");
			//json.put("channel", "C04DNV4FYP6");	//개발 서버용
			
			json.put("text", msg);
			
			post.addParameter("payload", json.toString());
			// 처음에 utf-8로 content-type안넣어주니까 한글은 깨져서  content-type넣어줌
			post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			int responseCode = client.executeMethod(post);
			String response = post.getResponseBodyAsString();
			if (responseCode != HttpStatus.SC_OK) { 
				System.out.println("Response: " + response);
			}
		} catch (IllegalArgumentException e) {
			System.out.println("IllegalArgumentException posting to Slack " + e);
		} catch (IOException e) {
			System.out.println("IOException posting to Slack " + e);
		} catch (Exception e) {
			System.out.println("Exception posting to Slack " + e);
		} finally {
			post.releaseConnection();
		}
		
	}
	
	
	/**
	 * 관리자로 문자 발송해주기
	 * 사용자가 보낸 문자를 문자온 법인폰으로 발송해주는 기능 함수.
	 * 일반문자 와 대량 문자 모두 적용하고 있음
	 * 2022.09.19 우영두 추가
	 * 2023.01.26 우영두 수정 => 대표전송사로 발송되도록 수정
	 * */
	public MjonMsgVO getAdminPhoneSendMsgDataComm(MjonMsgVO mjonMsgVO) throws Exception{
		
		try {
			mjonMsgVO.setUserId("system");//시스템 발송 문자로 처리
			
			//전송사 선택
			String msgType = mjonMsgVO.getMsgType();
			int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt());//그림 이미지 갯수
			
			if(msgType.equals("6")) {//장문 혹은 그림문자인 경우
				if(fileCount > 0) {//그림문자인 경우
					mjonMsgVO.setNeoType("4");
				}				
			}
			
			//수신번호가 배열로 되어있어서 배열에 담아준다.
			String[] phone = new String[1];
			String callTo = "01084329333";
			phone[0] = callTo;
			mjonMsgVO.setCallToList(phone);//수신번호 리스트
			
			//시스템 로그용 수신 정보
			mjonMsgVO.setCallTo("help@iten.co.kr");
			
			//현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크
	    	//String userMoney = "0.0";
	    	String userPoint = "0.0";
	    	mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장
	    	mjonMsgVO.setBefCash("0.0");		//관리자가 발송하는 것이라서 0원으로 입력
	    	mjonMsgVO.setMsgGroupCnt("1");
	    	
	    	//문자종류 관리자가 발송하는 것은 msgKind : S 로 셋팅
			mjonMsgVO.setMsgKind("S");
			
			Date now = new Date();
			SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
			mjonMsgVO.setReqDate(sdFormat.format(now));
			
			//예약 문자 발송 없이 즉시 발송으로 처리
			mjonMsgVO.setReserveYn("N");
			
		} catch (Exception e) {
			System.out.println("+++++++++++++++++++++++++++++ MjonCommon Class getAdminPhoneSendMsgData Function Error !!!" + e);
		}
		
		return mjonMsgVO;
	}
	
	
	/**
	 * 관리자가 사용자에게 문자 발송해주기
	 * 발신번호 승인 / 반려시 사용자에게 문자 발송해 주기.
	 * 일반문자 와 대량 문자 모두 적용하고 있음
	 * 2022.09.26 우영두 추가
	 * 
	 * */
	public MjonMsgVO getAdminToMberPhoneSendMsgDataComm(MjonMsgVO mjonMsgVO) throws Exception{
		
		try {
			mjonMsgVO.setUserId("system");//시스템 발송 문자로 처리
			
			//전송사 선택
			String msgType = mjonMsgVO.getMsgType();
			int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt());//그림 이미지 갯수
			
			if(msgType.equals("6")) {//장문 혹은 그림문자인 경우
				if(fileCount > 0) {//그림문자인 경우
					mjonMsgVO.setNeoType("4");
				}
			}
			
			//수신번호가 배열로 되어있어서 배열에 담아준다.
			String[] phone = new String[1];
			String callTo = mjonMsgVO.getCallTo();
			phone[0] = callTo;
			mjonMsgVO.setCallToList(phone);//수신번호 리스트
			
			//시스템 로그용 수신 정보
			mjonMsgVO.setCallTo(callTo);
			
			//현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크
	    	//String userMoney = "0.0";
	    	String userPoint = "0.0";
	    	mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장
	    	mjonMsgVO.setBefCash("0.0");		//관리자가 발송하는 것이라서 0원으로 입력
	    	mjonMsgVO.setMsgGroupCnt("1");
	    	
	    	//문자종류 관리자가 발송하는 것은 msgKind : S 로 셋팅
			mjonMsgVO.setMsgKind("S");
			
			//예약 문자 발송 없이 즉시 발송으로 처리
			mjonMsgVO.setReserveYn("N");
			
		} catch (Exception e) {
			System.out.println("+++++++++++++++++++++++++++++ MjonCommon Class getAdminToMberPhoneSendMsgData Function Error !!!" + e);
		}
		
		return mjonMsgVO;
	}
	
	@SuppressWarnings("unchecked")
	public void getAdminKakaoAtSandSlack(KakaoVO kakaoVO) {
		
		HttpClient client = new HttpClient();
		PostMethod post = new PostMethod(url);
		JSONObject json = new JSONObject();
		try {
			
			String reserveYn = kakaoVO.getReserveYn();
			String atDelayYn = kakaoVO.getAtDelayYn();
			String smsTxt = kakaoVO.getTemplateContent();
			String reservSmsTxt = "";
			String smisingSmsTxt = "";
			//예약문자를 발송하는 경우 문자 내용 앞에 "[예약]" 표시되도록 처리
			if(reserveYn.equals("Y")) {
				reservSmsTxt = "[예약]" + smsTxt;
				smsTxt = reservSmsTxt;
			}else if(atDelayYn.equals("Y")) {
				
				smisingSmsTxt = "[스미싱의심]" + smsTxt;
				smsTxt = smisingSmsTxt;
			}
			
			String sandName = kakaoVO.getCallFrom();
			String userId = kakaoVO.getUserId();
			String msgType = "";
			
			if(kakaoVO.getMsgType().equals("8")) {
				msgType = "[알림톡]";
			}else if(kakaoVO.getMsgType().equals("9")){
				
			}
			sandName = "[" + userId + "]" + "[" + sandName + "]" + msgType;
			
			json.put("channel", "mjon메시지");
			json.put("text", smsTxt);
			json.put("username", sandName);
			
			
			post.addParameter("payload", json.toString());
			// 처음에 utf-8로 content-type안넣어주니까 한글은 깨져서  content-type넣어줌
			post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			int responseCode = client.executeMethod(post);
			String response = post.getResponseBodyAsString();
			if (responseCode != HttpStatus.SC_OK) { 
				System.out.println("Response: " + response);
			}
		} catch (IllegalArgumentException e) {
			System.out.println("IllegalArgumentException posting to Slack " + e);
		} catch (IOException e) {
			System.out.println("IOException posting to Slack " + e);
		} catch (Exception e) {
			System.out.println("Exception posting to Slack " + e);
		} finally {
			post.releaseConnection();
		}
		
	}
	
	
	public String getCreateMsgUserIdgen(String subUserId, String lastId) throws Exception{
		
		String returnId = "";
		String[] splitId = lastId.split("_");
		
		if(splitId.length > 0) {
			
			int lastNum = Integer.parseInt(splitId[1]);
			
			lastNum = lastNum + 1;
			
			String tmpLastNum = Integer.toString(lastNum);
			
			int zeroPlusCnt = 14 - tmpLastNum.length();
			
			StringBuilder sb = new StringBuilder();
			sb.append(subUserId + "_");
			
			for(int i=0; i< zeroPlusCnt; i++) {
				
				sb.append('0');
				
			}
			
			sb.append(tmpLastNum);

			returnId = sb.toString();
			
		}
		
		return returnId;
	}
	
}
