package itn.let.kakao.kakaoComm;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import itn.com.cmm.util.StringUtil;
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uss.umt.service.MberManageVO;

@Component
public class KakaoSendUtil {

	@Autowired
	KakaoApiJsonSave kakaoApiJsonSave;
	
	@Resource(name = "MjonMsgDataService")
	private MjonMsgDataService mjonMsgDataService;
	
	
	/**
	* @Method Name : kakaoSendPrice
	* @작성일 : 2023. 2. 14.
	* @작성자 :  WYH
	* @Method 설명 : 카카오 전송 가격 설정
	*/
	public KakaoVO kakaoSendPrice(KakaoVO kakaoVO) throws Exception {
		
		//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
		String befCash = kakaoVO.getBefCash();
		
		//VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴
		if("".equals(befCash) || befCash == null) {
			
		}
		MjonMsgVO mjonMsgVO = new MjonMsgVO();
		mjonMsgVO.setUserId(kakaoVO.getUserId());
		String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
		String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO);
		
		//1.시스템 기본 단가 정보 불러오기
		JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
		
		//2.사용자 개인 단가 정보 불러오기
		MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId());
		Float kakaoAtPrice = mberManageVO.getKakaoAtPrice();
		
		/** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */
		//대체문자 발송 여부 확인
		if(kakaoVO.getSubMsgSendYn().equals("Y")) {
			
			
			String charset = "euc-kr"; 											//문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
			int callToCnt = kakaoVO.getCallToList().length;
			String sendType = "";
			
			for(int count =0; count < callToCnt; count++) {
				String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
				if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) {
					tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count);
				}
				int bytes = tempSubMagTxt.getBytes(charset).length;
				
				if(bytes < 2000) {
					if(bytes > 90) {
						sendType = "MMS";
						break;
					}else {
						sendType = "SMS";
					}
				}else {
					kakaoVO.setResultCode("2000");
					return kakaoVO;
				}
			}
			
			if(sendType.equals("MMS")) {
				//협의 단가가 없으면 시스템 단가로 지정
				if(mberManageVO.getLongPrice() < 1) {
					kakaoAtPrice = sysJoinSetVO.getLongPrice();
					
					kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
					kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
					kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
				}else {
					kakaoAtPrice = mberManageVO.getLongPrice();
					
					kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
					kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
					
					if(mberManageVO.getKakaoAtPrice() < 1) {
						kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
					}else {
						kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice());
					}
				}
			}else {
				//협의 단가가 없으면 시스템 단가로 지정
				if(mberManageVO.getShortPrice() < 1) {
					kakaoAtPrice = sysJoinSetVO.getShortPrice();
					
					kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
					kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
					kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
				}else {
					kakaoAtPrice = mberManageVO.getShortPrice();
					
					kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
					kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
					if(mberManageVO.getKakaoAtPrice() < 1) {
						kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
					}else {
						kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice());
					}
				}
			}
		}else {
			if(kakaoAtPrice < 1) { //협의 단가가 없으면 시스템 단가로 지정
				kakaoAtPrice = sysJoinSetVO.getKakaoAtPrice();
				
				kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
				kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
				kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
			}else {
				kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
				kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
				kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice());
			}
		}
		
		/** 전송인원 확인*/
		int totCallCnt = kakaoVO.getCallToList().length;
		Float kakaoTotPrice = totCallCnt * kakaoAtPrice; // 총결제 금액  = 총 전송수량 * 카카오 알림톡 단가
		String totPrice = kakaoTotPrice.toString();
		System.out.println("@@@@@@@   : "+kakaoTotPrice  +" =  "+totCallCnt+"  *  "+kakaoAtPrice);
		
		kakaoVO.setEachPrice(kakaoAtPrice.toString());
		kakaoVO.setBefCash(userMoney); // 고객 충전금액
		kakaoVO.setBefPoint(userPoint); // 고객 충전 포인트
		kakaoVO.setTotPrice(totPrice); // 총 카카오 전송 금액
		
		return kakaoVO;
	}
	
	/** 
	 * @methodName	: selectSendPriceOfKakaoAtAndSmsAndMms 
	 * @author		: 이호영
	 * @date		: 2023.03.02 
	 * @description	: 알림톡 / sms / mms 가격 불러오기
	 * @param String userID
	 * @return MberManageVO
	 * @throws Exception 
	 */
	public MberManageVO selectSendPriceOfKakaoAtAndSmsAndMms(String userId) throws Exception {

		//1.시스템 기본 단가 정보 불러오기
		JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();

		//2.사용자 개인 단가 정보 불러오기
		MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);

		// kakao 단가
		// 사용자 개인 단가가 없으면 시스템 단가로
		if(mberManageVO.getKakaoAtPrice() == 0.0f)
			mberManageVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
		
		
		// SMS 인경우
		// 사용자 개인 단가가 없으면 시스템 단가로
		if(mberManageVO.getShortPrice() == 0.0f)
			mberManageVO.setShortPrice(sysJoinSetVO.getShortPrice());
		
//		// MMS 인경우
		// 사용자 개인 단가가 없으면 시스템 단가로
		if(mberManageVO.getLongPrice() == 0.0f)
			mberManageVO.setLongPrice(sysJoinSetVO.getLongPrice());
		

		return mberManageVO;
	}
	
	
	
	/**
	* @Method Name : kakaoSendMsg
	* @작성일 : 2023. 2. 14.
	* @작성자 :  WYH
	* @Method 설명 : 카카오톡 전송 메세지 설정
	*/
	public KakaoVO kakaoSendMsg(KakaoVO kakaoVO) throws Exception {
			List<KakaoVO> kakaoSendList = new ArrayList<KakaoVO>();
			//전체 받는사람 수량만큼 반복 확인
			int callToCnt = kakaoVO.getCallToList().length;	
		try {
			for(int count =0; count < callToCnt; count++) {
				
				KakaoVO setSendMsgVO = new KakaoVO();
				
				setSendMsgVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호
				// 카카오 전송내용 설정
				// 변환문자 포함(Y), 미포함(N)
				if(kakaoVO.getTxtReplYn().equals("Y")) {
					
					String templateContent = kakaoSubMagTxtRepl(kakaoVO.getTemplateContent(), kakaoVO, count);
					setSendMsgVO.setTemplateContent(templateContent);
					
					if(kakaoVO.getTemplateEmphasizeType().equals("TEXT")) {
						
						String title = kakaoSubMagTxtRepl(kakaoVO.getTemplateTitle(), kakaoVO, count);
						String subTitle = kakaoVO.getTemplateSubtitle();
//						title = title +"§§"+ subTitle;
						setSendMsgVO.setTemplateEmphasizeType(kakaoVO.getTemplateEmphasizeType());
						setSendMsgVO.setTemplateTitle(title);
					}
					
				}else {
					
					if(kakaoVO.getTemplateEmphasizeType().equals("TEXT")) {
						
						String title = kakaoSubMagTxtRepl(kakaoVO.getTemplateTitle(), kakaoVO, count);
						String subTitle = kakaoVO.getTemplateSubtitle();
//						title = title +"§§"+ subTitle;
						setSendMsgVO.setTemplateEmphasizeType(kakaoVO.getTemplateEmphasizeType());
						setSendMsgVO.setTemplateTitle(title);
					}
					
					// 템플릿 내용 설정
					setSendMsgVO.setTemplateContent(kakaoVO.getTemplateContent());
				}
				
				//대체문자 포함(Y), 미포함(N)
				if(kakaoVO.getSubMsgSendYn().equals("Y")) {
					
					String charset = "euc-kr";	//문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
					
					String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
					kakaoVO.setKakaoSubMagOrgnlTxt(tempSubMagTxt);
					if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) {
						tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count);
					}
					System.out.println("@@  대체문자내용 : " + tempSubMagTxt);
					setSendMsgVO.setSubMsgTxt(tempSubMagTxt);
					
					int FrBytes = tempSubMagTxt.getBytes(charset).length;
					System.out.println("@@  대체문자길이 : " + FrBytes);
					//메세지 길이가 90Byte가 초과시 MMS
					if(FrBytes > 90) {
						setSendMsgVO.setSubMsgType("MMS");
					}else {// 아니면 SMS
						setSendMsgVO.setSubMsgType("SMS");
					}
					
					System.out.println("@@  대체문자타입 : " + setSendMsgVO.getSubMsgType());
				}
				
				if(kakaoVO.getBizJsonYn().equals("Y")) {
					kakaoVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호
					
					String[] varValInfo = null;
					if( kakaoVO.getVarValList().size() != 0) {
						varValInfo = kakaoVO.getVarValList().get(count);
					}
					String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, varValInfo);
//					String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, kakaoVO.getVarValList().get(count));
					setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명
				}
				
				kakaoSendList.add(setSendMsgVO);
			}
			kakaoVO.setKakaoSendList(kakaoSendList);
			
		} catch (Exception e) {
			System.out.println(e.toString());
			e.printStackTrace();
		}
		
		return kakaoVO;
	}
	
	public String kakaoSendMsgTest(KakaoVO kakaoVO) throws Exception {
		String templateContent = "";
		try {
			templateContent = kakaoSubMagTxtRepl(kakaoVO.getTemplateContent(), kakaoVO, 0);
		} catch (Exception e) {
			System.out.println(e.toString());
			e.printStackTrace();
		}
		
		return templateContent;
	}
	
	
	public String kakaoSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) {
		
//		String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
//		String tempSubMagTxt = msgTxt;
		
		//대체문자에 변환문자가 있는경우
		String[] varNm = new String[kakaoVO.getVarNmList().size()];
		int q=0;
		if(varNm.length != 0) {
			for(String temp : kakaoVO.getVarNmList()) {
				temp = temp.replaceAll("\\#\\{" , "§§");
				temp = temp.replaceAll("\\}" , "§");
				varNm[q] = temp;
				q++;
			}
			List<String[]> varValList = kakaoVO.getVarValList(); // value 값
			
			tempSubMagTxt = tempSubMagTxt.replaceAll(String.valueOf((char)13), "");
			
			tempSubMagTxt = tempSubMagTxt.replaceAll("\\#\\{" , "§§");
			tempSubMagTxt = tempSubMagTxt.replaceAll("\\}" , "§");
			
			String[] array = varValList.get(count)[0].split("§");
			for(int i=0; i < varNm.length; i++) {
				
				if (tempSubMagTxt.indexOf(varNm[i]) > -1) {
					if(array[i] != null) {
								
						System.out.println("as    :   "+varNm[i] +" : "+ StringUtil.getString(array[i]).replace('Ï', ','));
						
						tempSubMagTxt = tempSubMagTxt.replaceAll(varNm[i] , StringUtil.getString(array[i]).replace('Ï', ','));
						
						System.out.println(varNm[i] +" : "+ array[i].replace('Ï', ','));
						
					}else {
						tempSubMagTxt = tempSubMagTxt.replaceAll(varNm[i] , "");
					}
				}
			}
		}
		return tempSubMagTxt;
	}
}
