package com.madeu.service.web.websms.impl;

import com.google.gson.*;
import com.madeu.constants.Constants;
import com.madeu.dao.web.webauthmenurelation.WebAuthMenuRelationSqlMapDAO;
import com.madeu.dao.web.websms.WebSmsSqlMapDAO;
import com.madeu.dao.web.webmember.WebMemberSqlMapDAO;
import com.madeu.dao.web.webuser.WebUserSqlMapDAO;
import com.madeu.service.web.websms.WebSmsService;
import com.madeu.util.ValidationCheckUtil;
import com.popbill.api.MessageService;
import com.popbill.api.PopbillException;
import com.popbill.api.TaxinvoiceService;
import com.popbill.api.message.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;

@Slf4j
@Service("WebSmsService")
public class WebSmsServiceImpl implements WebSmsService {

    @Value("${popbill.corp-num}")
	String corpNum;

    @Value("${popbill.user-id}")
	String userId;

    @Value("${popbill.sender-nm}")
	String senderName;

    @Value("${popbill.sender-phone-num}")
	String senderPhoneNumber;

	@Autowired
	private WebSmsSqlMapDAO webSmsSqlMapDAO;

	@Autowired
	private WebMemberSqlMapDAO webMemberSqlMapDAO;
	
	@Autowired
	private WebAuthMenuRelationSqlMapDAO webAuthMenuRelationSqlMapDAO;

	@Autowired
	private WebUserSqlMapDAO webUserSqlMapDAO;

    @Autowired
    private MessageService messageService;

	@Autowired
	private TaxinvoiceService taxinvoiceService;

	/**
	 * 문자 리스트 조회
	 *
	 *
	 * @param paramMap
	 * @return
	 * @throws Exception
	 */
	@Override
	public HashMap<String, Object> selectListSms(
			HashMap<String, Object> paramMap) throws Exception {
		log.debug("WebSmsServiceImpl selectListSms START");

		HashMap<String, Object> map = new HashMap<String, Object>();

		log.debug("loginMemberId       :"+paramMap.get("loginMemberId"));
		
		log.debug("menuClass           :"+paramMap.get("menuClass"));
		
		log.debug("smsSearchKeywordParam  :"+paramMap.get("smsSearchKeywordParam"));
		log.debug("smsSort                :"+paramMap.get("smsSort"));
		log.debug("smsStart               :"+paramMap.get("smsStart"));
		log.debug("smsLimit               :"+paramMap.get("smsLimit"));
		log.debug("smsSort                :"+paramMap.get("smsSort"));
		log.debug("smsDir                 :"+paramMap.get("smsDir"));
		log.debug("smsCurrentPage         :"+paramMap.get("smsCurrentPage"));
		
		log.debug("smsSearchStartDate     :"+paramMap.get("smsSearchStartDate"));
		log.debug("smsSearchEndDate       :"+paramMap.get("smsSearchEndDate"));
		
		List<Map<String, Object>> listMap = new ArrayList<Map<String,Object>>();

		try{
			boolean check  = true;
			
			if(true == check){
				// 사용자 확인
				List<Map<String, Object>> userListMap = webMemberSqlMapDAO.checkMember(paramMap);
				int userListMapSize = userListMap.size();
				
				if(1==userListMapSize){
					paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId"));
				}
				else {
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc", "사용자 정보가 올바르지 않습니다.");
				}
			}
			
			if(true == check){
				// 정렬
				if(null==paramMap.get("smsDir")||("").equals(paramMap.get("smsDir"))){

				}
				else{
					String dir = String.valueOf(paramMap.get("smsDir"));
					if(("A").equals(dir)){
						paramMap.put("smsDir", "DESC");
					}
					else if(("B").equals(dir)){
						paramMap.put("smsDir", "ASC");
					}
					else {
						paramMap.put("smsDir", "DESC");
					}
				}

				paramMap.put("useYn", "Y");
				
				List<Map<String, Object>> totalCountListMap = webSmsSqlMapDAO.selectTotalSmsCount(paramMap);
				int totalCount = Integer.parseInt(String.valueOf(totalCountListMap.get(0).get("totalCount")));
				
				if(0 < totalCount) {
					// 리스트 조회
					listMap = webSmsSqlMapDAO.selectListSms(paramMap);
				}
				
				map.put("msgCode", Constants.OK);
				map.put("success","true");
				map.put("totalCount", totalCount);
				map.put("rows",listMap);
			}
		}
		catch(Exception e){
			e.printStackTrace();
			throw e;
		}
		log.debug("WebSmsServiceImpl selectListSms END");
		return map;
	}

	/**
	 * 문자 리스트 조회
	 *
	 *
	 * @param paramMap
	 * @return
	 * @throws Exception
	 */
	@Override
	public HashMap<String, Object> selectSms(
			HashMap<String, Object> paramMap) throws Exception {
		log.debug("WebSmsServiceImpl selectSms START");

		HashMap<String, Object> map = new HashMap<String, Object>();

		log.debug("loginMemberId       :"+paramMap.get("loginMemberId"));
		
		log.debug("menuClass           :"+paramMap.get("menuClass"));
		
		log.debug("smsSearchKeywordParam  :"+paramMap.get("smsSearchKeywordParam"));
		log.debug("smsSort                :"+paramMap.get("smsSort"));
		log.debug("smsStart               :"+paramMap.get("smsStart"));
		log.debug("smsLimit               :"+paramMap.get("smsLimit"));
		log.debug("smsSort                :"+paramMap.get("smsSort"));
		log.debug("smsDir                 :"+paramMap.get("smsDir"));
		log.debug("smsCurrentPage         :"+paramMap.get("smsCurrentPage"));
		
		log.debug("smsSearchStartDate     :"+paramMap.get("smsSearchStartDate"));
		log.debug("smsSearchEndDate       :"+paramMap.get("smsSearchEndDate"));
		
		List<Map<String, Object>> listMap = new ArrayList<Map<String,Object>>();

		try{
			boolean check  = true;
			
			if(true == check){
				// 사용자 확인
				List<Map<String, Object>> userListMap = webMemberSqlMapDAO.checkMember(paramMap);
				int userListMapSize = userListMap.size();
				
				if(1==userListMapSize){
					paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId"));
				}
				else {
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc", "사용자 정보가 올바르지 않습니다.");
				}
			}
			
			if(true == check){
				
				listMap = webSmsSqlMapDAO.selectSms(paramMap);
				
				map.put("msgCode", Constants.OK);
				map.put("success","true");
				map.put("rows",listMap);
			}
		}
		catch(Exception e){
			e.printStackTrace();
			throw e;
		}
		log.debug("WebSmsServiceImpl selectSms END");
		return map;
	}
	
	/**
	 * 문자 정보 등록
	 * 
	 * @param paramMap
	 * @return
	 * @throws Exception 
	 */
	@Override
	@Transactional(rollbackFor={Exception.class}, propagation = Propagation.REQUIRES_NEW)
	public HashMap<String, Object> insertSms(
			HashMap<String, Object> paramMap) throws Exception{
		log.debug("WebSmsServiceImpl insertSms START");
		
		HashMap<String, Object> map = new HashMap<String, Object>();

		log.debug("loginMemberId       :"+paramMap.get("loginMemberId"));
		
		log.debug("menuClass           :"+paramMap.get("menuClass"));
		
		log.debug("smsType             :"+paramMap.get("smsType"));
		log.debug("smsContent          :"+paramMap.get("smsContent"));
		log.debug("userArrData         :"+paramMap.get("userArrData"));

		try{
			boolean check  = true;
			String tId = String.valueOf(System.currentTimeMillis());
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Calendar c1 = Calendar.getInstance();
			String tDate = sdf.format(c1.getTime());

			String smsType    = String.valueOf(paramMap.get("smsType"));
			String smsContent    = String.valueOf(paramMap.get("smsContent"));
			String userArrData     = String.valueOf(paramMap.get("userArrData"));
			double remainPoint = 0;

			if(true != ValidationCheckUtil.emptyCheck(smsType)){
				check = false;
				map.put("msgCode", Constants.FAIL);
				map.put("msgDesc","SMS 타입 정보가 없습니다.");
			}

			if(true != ValidationCheckUtil.emptyCheck(smsContent)){
				check = false;
				map.put("msgCode", Constants.FAIL);
				map.put("msgDesc","내용 정보가 없습니다.");
			}else{
				if(true != ValidationCheckUtil.lengthCheck(smsContent, 2000)){
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc","내용 정보는 2000자를 넘을 수 없습니다.");
				}
			}

			if(true != ValidationCheckUtil.emptyCheck(userArrData)){
				check = false;
				map.put("msgCode", Constants.FAIL);
				map.put("msgDesc","발송대상 정보가 없습니다.");
			}

			if(true == check){
				// 사용자 확인
				List<Map<String, Object>> userListMap = webMemberSqlMapDAO.checkMember(paramMap);
				int userListMapSize = userListMap.size();
				
				if(1==userListMapSize){
					paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId"));
				}
				else {
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc", "사용자 정보가 올바르지 않습니다.");
				}
			}
			
			if(true == check){
				// 권한 조회
				HashMap<String, Object> authCheckParamMap = new HashMap<String, Object>();
				authCheckParamMap.put("menuClass",paramMap.get("menuClass"));
				authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId"));
				List<Map<String, Object>> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap);
				int authMenuRelationlistMapSize = authMenuRelationlistMap.size();
				
				if(1==authMenuRelationlistMapSize){
					
					if(("Y").equals(authMenuRelationlistMap.get(0).get("insertUseYn"))) {
						
					}
					else {
						check = false;
						map.put("msgCode", Constants.FAIL);
						map.put("msgDesc", "등록 권한 정보가 없습니다.");
					}
				}
				else {
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc", "권한 정보가 없습니다.");
				}
			}

			// 포인트 조회
			if(true == check){
	            try {
	                remainPoint = taxinvoiceService.getBalance(corpNum);

	                log.debug("remainPoint : "+remainPoint);

					if(0 == remainPoint){
						check = false;
						map.put("msgCode", Constants.FAIL);
						map.put("msgDesc", "팝빌 통합 포인트가 없습니다. 충전 후 발송해 주시기 바랍니다.");
					}

	            } catch (PopbillException e) {
	            	log.debug("오류 코드   :" + e.getCode());
                    log.debug("오류 메시지 :" + e.getMessage());
	            }
			}

			if(true == check){
				paramMap.put("tDate", tDate);
				paramMap.put("tId", tId);

				//gson 변경 후 등록
				Gson gsonPaser = new GsonBuilder().setPrettyPrinting().create();
				String data = String.valueOf(paramMap.get("userArrData"));

				//json 변환
				JsonObject itemData = gsonPaser.fromJson(data, JsonObject.class);
				JsonArray itemArr = (JsonArray) itemData.get("itemArr");
				int itemArrSize = itemArr.size();

				Message[] messages = new Message[itemArrSize];

				for(int i=0; i<itemArrSize; i++) {
					String receiver = itemArr.get(i).getAsJsonObject().get("phoneNumber").getAsString();
					String userName = itemArr.get(i).getAsJsonObject().get("userName").getAsString();

					log.debug("receiver : "+receiver);
					log.debug("userName : "+userName);

                    HashMap<String, Object> insertDetailParamMap = new HashMap<String, Object>();
					insertDetailParamMap.put("muSmsId", ("S").concat(String.valueOf(System.currentTimeMillis())));
					insertDetailParamMap.put("content", smsContent);
					insertDetailParamMap.put("smsType", smsType);
					insertDetailParamMap.put("state", "R");
					insertDetailParamMap.put("popbillState", "0");
					insertDetailParamMap.put("sender", senderPhoneNumber);
					insertDetailParamMap.put("regId", paramMap.get("regId"));
					insertDetailParamMap.put("modId", paramMap.get("modId"));
					insertDetailParamMap.put("tId", tId);

					//배열 값 해쉬맵 형식으로 한번에 변환
					insertDetailParamMap.putAll(gsonPaser.fromJson(itemArr.get(i).toString(), HashMap.class));

					//등록
					webSmsSqlMapDAO.insertSms(insertDetailParamMap);
					itemArr.get(i).getAsJsonObject().addProperty("muSmsId", String.valueOf(insertDetailParamMap.get("id")));


					// 문자 상태 업데이트
					HashMap<String, Object> smsUpdateParamMap = new HashMap<String, Object>();
					smsUpdateParamMap.put("oldState", "R");
					smsUpdateParamMap.put("chgState", "G");
					smsUpdateParamMap.put("modId", paramMap.get("modId"));
					smsUpdateParamMap.put("muSmsId", insertDetailParamMap.get("id"));
					smsUpdateParamMap.put("sendDateYn", "N");
					webSmsSqlMapDAO.updateSmsState(smsUpdateParamMap);


					Message msg = new Message();
					msg.setSender(senderPhoneNumber);     // 발신번호
					msg.setSenderName(senderName);        // 발신자명
					msg.setReceiver(receiver);            // 수신번호
					msg.setReceiverName(userName);        // 수신자명
					msg.setSubject("");                   // 문자제목
					msg.setContent(smsContent);           // 메시지내용

					messages[i] = msg;
				}

				String receiptNum = "";

				// 예약전송일시, null 처리시 즉시전송, 형태(yyyyMMddHHmmss)
				Date reserveDT = null;
				// 광고문자 전송여부
				Boolean adsYN = false;

				// 전송요청번호
				// 파트너가 전송 건에 대해 관리번호를 구성하여 관리하는 경우 사용.
				// 1~36자리로 구성. 영문, 숫자, 하이픈(-), 언더바(_)를 조합하여 팝빌 회원별로 중복되지 않도록 할당.
				String requestNum = "";

				try {
					if(("S").equals(smsType)){
						// SMS
						receiptNum = messageService.sendSMS(corpNum, senderPhoneNumber,
										smsContent, messages, reserveDT, adsYN, userId, requestNum);
					}else if(("L").equals(smsType)){
						// LMS
						receiptNum = messageService.sendLMS(corpNum, senderPhoneNumber,
									"", smsContent, messages, reserveDT, adsYN, userId, requestNum);
					}
				} catch (PopbillException e) {
					log.debug("오류 코드   :" + e.getCode());
					log.debug("오류 메시지 :" + e.getMessage());
				}

				for(int i=0; i<itemArrSize; i++) {
					log.debug("muSmsId : "+itemArr.get(i).getAsJsonObject().get("muSmsId").getAsString());

					// 문자 이력 업데이트
					HashMap<String, Object> smsUpdateParamMap = new HashMap<String, Object>();
					smsUpdateParamMap.put("oldState", "G");
					smsUpdateParamMap.put("chgState", "Y");
					smsUpdateParamMap.put("modId", paramMap.get("modId"));
					smsUpdateParamMap.put("muSmsId", itemArr.get(i).getAsJsonObject().get("muSmsId").getAsString());
					smsUpdateParamMap.put("receiptNum", receiptNum);
					smsUpdateParamMap.put("sendDateYn", "Y");
					webSmsSqlMapDAO.updateSmsState(smsUpdateParamMap);
				}

				map.put("msgCode", Constants.OK);
				map.put("msgDesc", "발송되었습니다.");
			}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw e;
		}
		log.debug("WebSmsServiceImpl insertSms END");
		return map;
	}

	/**
	 * 문자 정보 등록
	 *
	 * @param paramMap
	 * @return
	 * @throws Exception
	 */
	@Override
	@Transactional(rollbackFor={Exception.class}, propagation = Propagation.REQUIRES_NEW)
	public HashMap<String, Object> insertSmsHome(
			HashMap<String, Object> paramMap) throws Exception{
		log.debug("WebSmsServiceImpl insertSmsHome START");

		HashMap<String, Object> map = new HashMap<String, Object>();

		log.debug("loginMemberId       :"+paramMap.get("loginMemberId"));

		log.debug("menuClass           :"+paramMap.get("menuClass"));

		log.debug("smsType             :"+paramMap.get("smsType"));
		log.debug("smsContent          :"+paramMap.get("smsContent"));
		log.debug("muUserId            :"+paramMap.get("muUserId"));

		try{
			boolean check  = true;
			String tId = String.valueOf(System.currentTimeMillis());
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Calendar c1 = Calendar.getInstance();
			String tDate = sdf.format(c1.getTime());

			String smsType      = String.valueOf(paramMap.get("smsType"));
			String smsContent   = String.valueOf(paramMap.get("smsContent"));
			String muUserId     = String.valueOf(paramMap.get("muUserId"));
			double remainPoint = 0;
			List<Map<String, Object>> userListMap2 = null;

			if(true != ValidationCheckUtil.emptyCheck(smsType)){
				check = false;
				map.put("msgCode", Constants.FAIL);
				map.put("msgDesc","SMS 타입 정보가 없습니다.");
			}

			if(true != ValidationCheckUtil.emptyCheck(smsContent)){
				check = false;
				map.put("msgCode", Constants.FAIL);
				map.put("msgDesc","내용 정보가 없습니다.");
			}else{
				if(true != ValidationCheckUtil.lengthCheck(smsContent, 2000)){
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc","내용 정보는 2000자를 넘을 수 없습니다.");
				}
			}

			if(true != ValidationCheckUtil.emptyCheck(muUserId)){
				check = false;
				map.put("msgCode", Constants.FAIL);
				map.put("msgDesc","발송대상 정보가 없습니다.");
			}else{
				userListMap2 = webUserSqlMapDAO.selectUser(paramMap);
			}

			if(true == check){
				// 사용자 확인
				List<Map<String, Object>> userListMap = webMemberSqlMapDAO.checkMember(paramMap);
				int userListMapSize = userListMap.size();

				if(1==userListMapSize){
					paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId"));
				}
				else {
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc", "사용자 정보가 올바르지 않습니다.");
				}
			}

			if(true == check){
				// 권한 조회
				HashMap<String, Object> authCheckParamMap = new HashMap<String, Object>();
				authCheckParamMap.put("menuClass",paramMap.get("menuClass"));
				authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId"));
				List<Map<String, Object>> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap);
				int authMenuRelationlistMapSize = authMenuRelationlistMap.size();

				if(1==authMenuRelationlistMapSize){

					if(("Y").equals(authMenuRelationlistMap.get(0).get("insertUseYn"))) {

					}
					else {
						check = false;
						map.put("msgCode", Constants.FAIL);
						map.put("msgDesc", "등록 권한 정보가 없습니다.");
					}
				}
				else {
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc", "권한 정보가 없습니다.");
				}
			}

			// 포인트 조회
			if(true == check){
	            try {
	                remainPoint = taxinvoiceService.getBalance(corpNum);

	                log.debug("remainPoint : "+remainPoint);

					if(0 == remainPoint){
						check = false;
						map.put("msgCode", Constants.FAIL);
						map.put("msgDesc", "팝빌 통합 포인트가 없습니다. 충전 후 발송해 주시기 바랍니다.");
					}

	            } catch (PopbillException e) {
	            	log.debug("오류 코드   :" + e.getCode());
                    log.debug("오류 메시지 :" + e.getMessage());
	            }
			}

			if(true == check){
				paramMap.put("tDate", tDate);
				paramMap.put("tId", tId);

				Message[] messages = new Message[1];

				String receiver = String.valueOf(userListMap2.get(0).get("phoneNumber"));
				String userName = String.valueOf(userListMap2.get(0).get("userName"));

				log.debug("receiver : "+receiver);
				log.debug("userName : "+userName);

				HashMap<String, Object> insertDetailParamMap = new HashMap<String, Object>();
				insertDetailParamMap.put("muSmsId", ("S").concat(String.valueOf(System.currentTimeMillis())));
				insertDetailParamMap.put("content", smsContent);
				insertDetailParamMap.put("smsType", smsType);
				insertDetailParamMap.put("state", "R");
				insertDetailParamMap.put("popbillState", "0");
				insertDetailParamMap.put("sender", senderPhoneNumber);
				insertDetailParamMap.put("regId", paramMap.get("regId"));
				insertDetailParamMap.put("modId", paramMap.get("modId"));
				insertDetailParamMap.put("tId", tId);

				//등록
				webSmsSqlMapDAO.insertSms(insertDetailParamMap);


				// 문자 상태 업데이트
				HashMap<String, Object> smsUpdateParamMap = new HashMap<String, Object>();
				smsUpdateParamMap.put("oldState", "R");
				smsUpdateParamMap.put("chgState", "G");
				smsUpdateParamMap.put("modId", paramMap.get("modId"));
				smsUpdateParamMap.put("muSmsId", insertDetailParamMap.get("id"));
				smsUpdateParamMap.put("sendDateYn", "N");
				webSmsSqlMapDAO.updateSmsState(smsUpdateParamMap);


				Message msg = new Message();
				msg.setSender(senderPhoneNumber);     // 발신번호
				msg.setSenderName(senderName);        // 발신자명
				msg.setReceiver(receiver);            // 수신번호
				msg.setReceiverName(userName);        // 수신자명
				msg.setSubject("");                   // 문자제목
				msg.setContent(smsContent);           // 메시지내용

				messages[0] = msg;

				String receiptNum = "";

				// 예약전송일시, null 처리시 즉시전송, 형태(yyyyMMddHHmmss)
				Date reserveDT = null;
				// 광고문자 전송여부
				Boolean adsYN = false;

				// 전송요청번호
				// 파트너가 전송 건에 대해 관리번호를 구성하여 관리하는 경우 사용.
				// 1~36자리로 구성. 영문, 숫자, 하이픈(-), 언더바(_)를 조합하여 팝빌 회원별로 중복되지 않도록 할당.
				String requestNum = "";

				try {
					if(("S").equals(smsType)){
						// SMS
						receiptNum = messageService.sendSMS(corpNum, senderPhoneNumber,
										smsContent, messages, reserveDT, adsYN, userId, requestNum);
					}else if(("L").equals(smsType)){
						// LMS
						receiptNum = messageService.sendLMS(corpNum, senderPhoneNumber,
									"", smsContent, messages, reserveDT, adsYN, userId, requestNum);
					}
				} catch (PopbillException e) {
					log.debug("오류 코드   :" + e.getCode());
					log.debug("오류 메시지 :" + e.getMessage());
				}


				// 문자 이력 업데이트
				smsUpdateParamMap = new HashMap<String, Object>();
				smsUpdateParamMap.put("oldState", "G");
				smsUpdateParamMap.put("chgState", "Y");
				smsUpdateParamMap.put("modId", paramMap.get("modId"));
				smsUpdateParamMap.put("muSmsId", insertDetailParamMap.get("id"));
				smsUpdateParamMap.put("receiptNum", receiptNum);
				smsUpdateParamMap.put("sendDateYn", "Y");
				webSmsSqlMapDAO.updateSmsState(smsUpdateParamMap);

				map.put("msgCode", Constants.OK);
				map.put("msgDesc", "발송되었습니다.");
			}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw e;
		}
		log.debug("WebSmsServiceImpl insertSmsHome END");
		return map;
	}

	/**
	 * 문자 정보 등록 - 상담 차트
	 *
	 * @param paramMap
	 * @return
	 * @throws Exception
	 */
	@Override
	@Transactional(rollbackFor={Exception.class}, propagation = Propagation.REQUIRES_NEW)
	public HashMap<String, Object> insertSmsConsultingChart(
			HashMap<String, Object> paramMap) throws Exception{
		log.debug("WebSmsServiceImpl insertSmsConsultingChart START");

		HashMap<String, Object> map = new HashMap<String, Object>();

		log.debug("loginMemberId       :"+paramMap.get("loginMemberId"));

		log.debug("menuClass           :"+paramMap.get("menuClass"));

		log.debug("smsType             :"+paramMap.get("smsType"));
		log.debug("muUserId            :"+paramMap.get("muUserId"));
		log.debug("smsSendDate         :"+paramMap.get("smsSendDate"));
		log.debug("smsSendTime         :"+paramMap.get("smsSendTime"));
		log.debug("smsContent          :"+paramMap.get("smsContent"));

		try{
			boolean check  = true;
			String tId = String.valueOf(System.currentTimeMillis());
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Calendar c1 = Calendar.getInstance();
			String tDate = sdf.format(c1.getTime());

			String smsType       = String.valueOf(paramMap.get("smsType"));
			String muUserId      = String.valueOf(paramMap.get("muUserId"));
			String smsSendDate   = String.valueOf(paramMap.get("smsSendDate"));
			String smsSendTime   = String.valueOf(paramMap.get("smsSendTime"));
			String smsContent    = String.valueOf(paramMap.get("smsContent"));

			List<Map<String, Object>> userListMap2 = null;

			if(true != ValidationCheckUtil.emptyCheck(smsType)){
				check = false;
				map.put("msgCode", Constants.FAIL);
				map.put("msgDesc","SMS 타입 정보가 없습니다.");
			}

			if(true != ValidationCheckUtil.emptyCheck(smsContent)){
				check = false;
				map.put("msgCode", Constants.FAIL);
				map.put("msgDesc","내용 정보가 없습니다.");
			}else{
				if(true != ValidationCheckUtil.lengthCheck(smsContent, 2000)){
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc","내용 정보는 2000자를 넘을 수 없습니다.");
				}
			}

			if(true != ValidationCheckUtil.emptyCheck(muUserId)){
				check = false;
				map.put("msgCode", Constants.FAIL);
				map.put("msgDesc","고객 정보가 없습니다.");
			}else{
				userListMap2 = webUserSqlMapDAO.selectUser(paramMap);
				int userListSize = userListMap2.size();
				if(0==userListSize){
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc","고객 정보가 올바르지 않습니다.");
				}
			}

			if(true != ValidationCheckUtil.emptyCheck(smsSendDate)){
				check = false;
				map.put("msgCode", Constants.FAIL);
				map.put("msgDesc","발송일자 정보가 없습니다.");
			}

			if(true != ValidationCheckUtil.emptyCheck(smsSendTime)){
				check = false;
				map.put("msgCode", Constants.FAIL);
				map.put("msgDesc","발송시간 정보가 없습니다.");
			}

			if(true == check){
				// 사용자 확인
				List<Map<String, Object>> userListMap = webMemberSqlMapDAO.checkMember(paramMap);
				int userListMapSize = userListMap.size();

				if(1==userListMapSize){
					paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId"));
				}
				else {
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc", "사용자 정보가 올바르지 않습니다.");
				}
			}

			if(true == check){
				// 권한 조회
				HashMap<String, Object> authCheckParamMap = new HashMap<String, Object>();
				authCheckParamMap.put("menuClass",paramMap.get("menuClass"));
				authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId"));
				List<Map<String, Object>> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap);
				int authMenuRelationlistMapSize = authMenuRelationlistMap.size();

				if(1==authMenuRelationlistMapSize){

					if(("Y").equals(authMenuRelationlistMap.get(0).get("insertUseYn"))) {

					}
					else {
						check = false;
						map.put("msgCode", Constants.FAIL);
						map.put("msgDesc", "등록 권한 정보가 없습니다.");
					}
				}
				else {
					check = false;
					map.put("msgCode", Constants.FAIL);
					map.put("msgDesc", "권한 정보가 없습니다.");
				}
			}

			if(true == check){
				paramMap.put("tDate", tDate);
				paramMap.put("tId", tId);


				Message[] messages = new Message[1];

				String receiver = String.valueOf(userListMap2.get(0).get("phoneNumber"));
				String userName = String.valueOf(userListMap2.get(0).get("userName"));

				log.debug("receiver : "+receiver);
				log.debug("userName : "+userName);

				HashMap<String, Object> insertDetailParamMap = new HashMap<String, Object>();
				insertDetailParamMap.put("muSmsId", ("S").concat(String.valueOf(System.currentTimeMillis())));
				insertDetailParamMap.put("content", smsContent);
				insertDetailParamMap.put("smsType", smsType);
				insertDetailParamMap.put("state", "R");
				insertDetailParamMap.put("popbillState", "0");
				insertDetailParamMap.put("sender", senderPhoneNumber);
				insertDetailParamMap.put("regId", paramMap.get("regId"));
				insertDetailParamMap.put("modId", paramMap.get("modId"));
				insertDetailParamMap.put("tId", tId);
				insertDetailParamMap.put("phoneNumber", receiver);
				insertDetailParamMap.put("userName", userName);
				insertDetailParamMap.put("muUserId", paramMap.get("muUserId"));

				//등록
				webSmsSqlMapDAO.insertSmsConsultingChart(insertDetailParamMap);


				// 문자 상태 업데이트
				HashMap<String, Object> smsUpdateParamMap = new HashMap<String, Object>();
				smsUpdateParamMap.put("oldState", "R");
				smsUpdateParamMap.put("chgState", "G");
				smsUpdateParamMap.put("modId", paramMap.get("modId"));
				smsUpdateParamMap.put("muSmsId", insertDetailParamMap.get("id"));
				smsUpdateParamMap.put("sendDateYn", "N");
				webSmsSqlMapDAO.updateSmsState(smsUpdateParamMap);


				Message msg = new Message();
				msg.setSender(senderPhoneNumber);     // 발신번호
				msg.setSenderName(senderName);        // 발신자명
				msg.setReceiver(receiver);            // 수신번호
				msg.setReceiverName(userName);        // 수신자명
				msg.setSubject("");                   // 문자제목
				msg.setContent(smsContent);           // 메시지내용

				messages[0] = msg;

				String receiptNum = "";

				// 예약전송일시, null 처리시 즉시전송, 형태(yyyyMMddHHmmss)
				String tempSendDate = smsSendDate.concat(" ").concat(smsSendTime);
				DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
				LocalDateTime date = LocalDateTime.parse(tempSendDate, formatter);
				Date reserveDT = Date.from(date.atZone(ZoneId.systemDefault()).toInstant());
				// 광고문자 전송여부
				Boolean adsYN = false;

				// 전송요청번호
				// 파트너가 전송 건에 대해 관리번호를 구성하여 관리하는 경우 사용.
				// 1~36자리로 구성. 영문, 숫자, 하이픈(-), 언더바(_)를 조합하여 팝빌 회원별로 중복되지 않도록 할당.
				String requestNum = "";

				try {
					if(("S").equals(smsType)){
						// SMS
						receiptNum = messageService.sendSMS(corpNum, senderPhoneNumber,
										smsContent, messages, reserveDT, adsYN, userId, requestNum);
					}else if(("L").equals(smsType)){
						// LMS
						receiptNum = messageService.sendLMS(corpNum, senderPhoneNumber,
									"", smsContent, messages, reserveDT, adsYN, userId, requestNum);
					}
				} catch (PopbillException e) {
					log.debug("오류 코드   :" + e.getCode());
					log.debug("오류 메시지 :" + e.getMessage());
				}


				// 문자 이력 업데이트
				smsUpdateParamMap = new HashMap<String, Object>();
				smsUpdateParamMap.put("oldState", "G");
				smsUpdateParamMap.put("chgState", "Y");
				smsUpdateParamMap.put("modId", paramMap.get("modId"));
				smsUpdateParamMap.put("muSmsId", insertDetailParamMap.get("id"));
				smsUpdateParamMap.put("receiptNum", receiptNum);
				smsUpdateParamMap.put("reserveDateYn", "Y");
				smsUpdateParamMap.put("reserveDate", reserveDT);
				webSmsSqlMapDAO.updateSmsState(smsUpdateParamMap);

				map.put("msgCode", Constants.OK);
				map.put("msgDesc", "발송되었습니다.");


			}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw e;
		}
		log.debug("WebSmsServiceImpl insertSmsConsultingChart END");
		return map;
	}

	public String smsContent(String templateCode, String templateContent, JsonElement itemArr){

		String content = templateContent;

		if(("024060000138").equals(templateCode)){
			// 해피콜부재
			content = content.replace("#{고객명}", itemArr.getAsJsonObject().get("userName").getAsString());

		}else if(("024060000139").equals(templateCode)){
			// 해피콜상담예약취소

		}else if(("024060000141").equals(templateCode)){
			// 상담부재문자안내
			content = content.replace("#{고객명}", itemArr.getAsJsonObject().get("userName").getAsString());

		}else if(("024060000142").equals(templateCode)){
			// 상담예약부재문자
			content = content.replace("#{고객명}", itemArr.getAsJsonObject().get("userName").getAsString());

		}else if(("024060000145").equals(templateCode)){
			// 해피콜(간호)

		}else if(("024060000146").equals(templateCode)){
			// 홈페이지당일예약 문자

		}else if(("024060000195").equals(templateCode)){
			// 리프팅주의사항

		}else if(("024060000115").equals(templateCode)){
			// 병원위치, 주차장안내

		}else if(("024060000119").equals(templateCode)){
			// 메쉬다S플러스 체험단 리뷰가이드

		}else if(("024060000120").equals(templateCode)){
			// 메이드유 계좌번호 안내

		}else if(("024060000123").equals(templateCode)){
			// 리쥬란힐러 주의사항

		}else if(("024060000125").equals(templateCode)){
			// 보톡스 주의사항

		}else if(("024060000126").equals(templateCode)){
			// 스컬트라 주의사항

		}else if(("024060000130").equals(templateCode)){
			// 실루엣소프트 주의사항

		}else if(("024060000131").equals(templateCode)){
			// 실리프팅 주의사항

		}else if(("024060000132").equals(templateCode)){
			// 필러 주의사항

		}else if(("024060000133").equals(templateCode)){
			// 필러시술후
			content = content.replace("#{고객명}", itemArr.getAsJsonObject().get("userName").getAsString());

		}else if(("024060000136").equals(templateCode)){
			// 해피콜문자(피부압출시술)

		}

		return content;
	}
}
