package itn.let.mjo.spammsg.web;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.LoginVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.lett.service.LetterService;
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.spammsg.service.MjonSpamMsgService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.UserManageVO;

@Controller
public class MjonSpamMsgController {
	
	@Resource(name = "mjonMsgService")
    private MjonMsgService mjonMsgService;
	
	@Resource(name = "mjonSpamMsgService")
    private MjonSpamMsgService mjonSpamMsgService;
	
	@Resource(name = "LetterService")
    private LetterService letterService;
	
	@Resource(name = "MjonMsgDataService")
    private MjonMsgDataService mjonMsgDataService;
	
	/** userManageService */
	@Resource(name = "userManageService")
	private EgovUserManageService userManageService;

	
	@RequestMapping(value= {"/web/mjon/spammsgdata/insertSpamKeyWordMsgDataAjax.do"})
	public ModelAndView insertSpamKeyWordMsgDataAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO) throws Exception{
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		String userId = "";
		try {
			
			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
	    	userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
	    	
	    	if(userId.equals("")) {
	    		
	    		modelAndView.addObject("message", "로그인 후 이용이 가능합니다.");
				modelAndView.addObject("result", "loginFail");
				return modelAndView;
	    		
	    	}
	    	
	    	mjonMsgVO.setUserId(userId);
	    	
	    	//문자 즉시 발송 일경우 시간 셋팅
	    	
	    	String reserveYn = mjonMsgVO.getReserveYn();
	    	
	    	if(reserveYn.equals("N")) {//즉시발송인 경우 현재 시간 셋팅해줌
	    		
	    		Date now = new Date();
				SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
				mjonMsgVO.setReqDate(sdFormat.format(now));
	    		
	    	}
			
	    	String msgType = mjonMsgVO.getMsgType();
	    	int fileCount = 0;
	    	
	    	if(msgType.equals("6")) {// 단문이 아닌경우 그림이미지가 있는지 체크
	    		
	    		//그림 이미지가 첨부된 경우
        		if(mjonMsgVO.getImgFilePath() != null || mjonMsgVO.getImgFilePath().length > 0) {
        			
        			String[] path = mjonMsgVO.getImgFilePath();
        			String[] fileId = mjonMsgVO.getImgFileId();
        			String[] templateYn = mjonMsgVO.getTemplateYn();
        			
            		for(int i=0; i<path.length; i++) {
            			
                		if("Y".equals(templateYn[i])) {
            				//템플릿 사용누계 증가
                			letterService.updateTemplateUseCount(fileId[i]);
            			}
                		
                		String atchFileId = fileId[i];
                		String imgFilePath = mjonMsgService.selectPhotoImgFileRealPath(atchFileId);
                		
                		// 아이하트, 현대퓨쳐넷 두 중계사는 이미지 경로는 풀패스 경로로 넘겨주면 됨
                		if(i == 0) {
                			
                			mjonMsgVO.setFilePath1(imgFilePath);
                			mjonMsgVO.setFileName1(imgFilePath);
                			
                		}else if(i == 1) {
                			
                			mjonMsgVO.setFilePath2(imgFilePath);
                			mjonMsgVO.setFileName2(imgFilePath);
                			
                		}else {
                			
                			mjonMsgVO.setFilePath3(imgFilePath);
                			mjonMsgVO.setFileName3(imgFilePath);
                			
                		}
                		fileCount ++;
                	}
                	
                	//첨부파일 갯수 셋팅해주기
                	mjonMsgVO.setFileCnt(Integer.toString(fileCount));
        			
        		}
	    		
	    	}
	    		    	
			//전체 발송 건수 계산 - 수신자 리스트 갯수 체크
			String msgGroupCnt = Integer.toString(mjonMsgVO.getCallToList().length);
	    	mjonMsgVO.setMsgGroupCnt(msgGroupCnt);
	    	
	    	//현재 고객의 보유 캐시 및 포인트 정보 체크
	    	String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
	    	String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO);
	    	//String totPrice = mjonMsgVO.getTotPrice();
	    	
	    	BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
	    	//BigDecimal totMsgPrice = new BigDecimal(totPrice).setScale(2, RoundingMode.HALF_EVEN);

	    	mjonMsgVO.setBefCash(befCash.toString());//차감 이전의 보유 캐시 저장
	    	mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장
	    	
	    	//스팸문자 발송 관리 테이블에 데이터 저장 - 문자는 발송 하지 않음. 이후 회원 이용정치 저리 함.
	    	int resultCnt = mjonSpamMsgService.insertSpamKeyWordMsgData(mjonMsgVO);
	    	
	    	
	    	modelAndView.addObject("message", "전송 문자내용 중 스팸문구로 의심되는 단어가 포함된 문자를 발송하여 <br/>회원 이용정지 처리 되었습니다.<br/>자세한 사항은 문자온 고객센터를 통해 문의주시기 바랍니다.");
			modelAndView.addObject("result", "spamKeyWordFail");
			
			
		} catch (Exception e) {
			
			System.out.println("++++++++++++++++++ insertSpamKeyWordMsgDataAjax Controller Error !!!" + e);
			modelAndView.addObject("message", "오류가 발생하였습니다.");
			modelAndView.addObject("result", "fail");
			return modelAndView;
		}
		
		/**
		 * 사용자가 보낸 문자를 문자온 법인폰으로도 하나 전송하는 기능 시작
		 * 
		 * */
		
		try {
			
			String adminSmsNoticeYn = "Y";
			UserManageVO userManageVO = new UserManageVO();
			userManageVO.setMberId(userId);
			if(!userId.equals("")) {
				userManageVO = userManageService.selectAdminSmsNoticeYn(userManageVO);
				adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); 
			}
			
			if(adminSmsNoticeYn.equals("Y")) {
				getAdminPhoneSendMsgData(mjonMsgVO);
			}

    	} catch (Exception e) {
			throw new Exception("++++++++++++++++++++++ getAdminPhoneSendMsgData Error !!! " + e);
		}
		
		return modelAndView;
	}
	
	
	/**
	 * 관리자로 문자 발송해주기
	 * 사용자가 보낸 문자를 문자온 법인폰으로 발송해주는 기능 함수.
	 * 일반문자 와 대량 문자 모두 적용하고 있음
	 * 2022.09.19 우영두 추가
	 * 
	 * */
	public boolean getAdminPhoneSendMsgData(MjonMsgVO mjonMsgVO) throws Exception{
		
		try {
			
			mjonMsgVO.setUserId("system");//시스템 발송 문자로 처리
			
			//전송사 선택
			String msgType = mjonMsgVO.getMsgType();
			int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt());//그림 이미지 갯수
			
			
			//예약문자를 발송하는 경우 문자 내용 앞에 "[자동이용정지]" 표시되도록 처리 - 법인폰으로 발송되는 문자내용 수정함.20221125 추가
			//String reserveYn = mjonMsgVO.getReserveYn();
				
			String smsTxt = mjonMsgVO.getSmsTxt();
			String reservSmsTxt = "[자동이용정지]" + smsTxt;
			
			//[예약] 문구 추가시 문자열 길이 및 문자 종류 재계산 하기
			String charset = "euc-kr";
			int bytes = reservSmsTxt.getBytes(charset).length;	//발송 문자 길이
			
			if(bytes > 2000) {//문자열 길이가 2000을 넘어가면 [예약] 문구를 제외한 원래 문구를 넣어준다. 안그러면 문자전송이 실패하게 됨.
				
				mjonMsgVO.setSmsTxt(smsTxt);
				
			}else {
				
				//[예약] 문구를 추가한 내용으로 메세지 내용을 셋팅해 준다.
				mjonMsgVO.setSmsTxt(reservSmsTxt);
				if(bytes > 90) {//장문일 경우 문자타입을 변경해준다.
					
					msgType = "6";
					mjonMsgVO.setMsgType(msgType);
					
				}
				
			}
				
			/**
			 * 문자 종류 별 가장 저렴한 단가(아이하트를 제외)
			 * sms : 다우(7.3), 현대퓨처넷(7.5)
			 * Lms : 현대퓨처넷(23.5)
			 * MMS : 아이엠오(49)
			 * 
			 * */
			if(msgType.equals("4")) {//단문인 경우
				
				mjonMsgVO.setAgentCode("02");//현대퓨처넷
				
			}else if(msgType.equals("6")) {//장문 혹은 그림문자인 경우
				
				if(fileCount > 0) {//그림문자인 경우 아이엠오로 전송
					
					mjonMsgVO.setAgentCode("03");//아이엠오
					mjonMsgVO.setNeoType("4");
					
				}else {//장문인 경우
					
					mjonMsgVO.setAgentCode("02");//현대퓨처넷
				}
				
			}
			
			//mjonMsgVO.setAgentCode("01");
			
			//수신번호가 배열로 되어있어서 배열에 담아준다.
			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");
			
			//문자발송 금액 계산하기
			//문자 전송 개인 단가 불러오기
			//1.시스템 기본 단가 정보 불러오기
			JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
			
			//3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용
			Float shortPrice = sysJoinSetVO.getShortPrice();
			Float longPrice = sysJoinSetVO.getLongPrice();
			Float photo1Price = sysJoinSetVO.getPicturePrice();
			Float photo2Price = sysJoinSetVO.getPicture2Price();
			Float photo3Price = sysJoinSetVO.getPicture3Price();

			if(mjonMsgVO.getMsgType().equals("4")) {	//단문 금액 
				
				mjonMsgVO.setTotPrice(shortPrice.toString());	//총금액
				mjonMsgVO.setEachPrice(shortPrice.toString());	//한건 금액
				
			}else if(mjonMsgVO.getMsgType().equals("6")){	
				
				if(fileCount == 0) {//장문 금액
					
					mjonMsgVO.setTotPrice(longPrice.toString());
					mjonMsgVO.setEachPrice(longPrice.toString());
				
				}else if(fileCount == 1) {//그림 1장 금액
					
					mjonMsgVO.setTotPrice(photo1Price.toString());
					mjonMsgVO.setEachPrice(photo1Price.toString());
					
				}else if(fileCount == 2) {//그림 2장 금액
					
					mjonMsgVO.setTotPrice(photo2Price.toString());
					mjonMsgVO.setEachPrice(photo2Price.toString());
					
				}else if(fileCount == 3) {//그림 3장 금액
					
					mjonMsgVO.setTotPrice(photo3Price.toString());
					mjonMsgVO.setEachPrice(photo3Price.toString());
					
				}
			}
			
			//문자온 법인폰으로 전송하는 것이기에 현재시간으로 즉시 발송하도록 함.
			Date now = new Date();
			SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
			mjonMsgVO.setReqDate(sdFormat.format(now));
			
			//문자 발송 처리
			mjonMsgDataService.insertAdmToMberMsgDataInfo(mjonMsgVO); 
			
		} catch (Exception e) {
			throw new Exception("+++++++++++++++++++++++++++++ getAdminPhoneSendMsgData Function Error !!!" + e);
		}
		
		return true;
	}
	
	
	
}
