package itn.com.cmm.util;

import org.apache.commons.lang3.StringUtils;

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

public class SlackMessageFormatUtil {
	
	private static final String PREFIX_SMISHING = "[스미싱의심]";
	private static final String PREFIX_RESERVE = "[예약]";
	private static final String PREFIX_IMAGE = "그림문자 ";

	/**
	 * 일반 SMS 메시지 텍스트 포맷팅
	 */
	public static String formatSmsText(MjonMsgVO mjonMsgVO) {
		String smsTxt = mjonMsgVO.getSmsTxt();
		String reserveYn = safeGetString(mjonMsgVO.getReserveYn());
		String delayYn = safeGetString(mjonMsgVO.getDelayYn());
		String smishingYn = safeGetString(mjonMsgVO.getSmishingYn());
		
		// 공통 텍스트 포맷팅 로직 적용
		smsTxt = formatMessagePrefix(smsTxt, reserveYn, 
					"Y".equals(smishingYn) || "Y".equals(delayYn));
		
		// 그림 문자 처리 (SMS 전용 로직)
		int fileCount = parseIntOrDefault(mjonMsgVO.getFileCnt(), 0);
		if ("6".equals(mjonMsgVO.getMsgType()) && fileCount > 0 && StringUtils.isEmpty(smsTxt)) {
		    smsTxt = "그림문자 " + smsTxt;
		}
		
		return smsTxt;
	}
	
	/**
	 * 카카오톡 메시지 텍스트 포맷팅
	 */
	public static String formatKakaoText(KakaoSendAdvcVO sendVO) {
		String smsTxt = sendVO.getTemplateContent();
		String reserveYn = safeGetString(sendVO.getReserveYn());
		String atDelayYn = safeGetString(sendVO.getAtDelayYn());
		
		// 공통 텍스트 포맷팅 로직 적용
		return formatMessagePrefix(smsTxt, reserveYn, "Y".equals(atDelayYn));
	}
	
	
	public static String formatSandName(MjonMsgVO mjonMsgVO) {
		String userId = mjonMsgVO.getUserId();
		String callFrom = mjonMsgVO.getCallFrom();
		String msgType = getMessageTypeLabel(mjonMsgVO.getMsgType(), mjonMsgVO.getFileCnt());
		return String.format("[%s][%s]%s", userId, callFrom, msgType);
	}
	
	/**
	 * 메시지 접두사 포맷팅 공통 로직 (예약 및 스미싱 의심 접두사 처리)
	 * 
	 * @param messageText 원본 메시지 텍스트
	 * @param reserveYn   예약 여부
	 * @param isSmishing  스미싱 의심 여부
	 * @return 포맷팅된 메시지 텍스트
	 */
	public static String formatMessagePrefix(String messageText, String reserveYn, boolean isSmishing) {
		if ("Y".equals(reserveYn)) {
			return isSmishing ? PREFIX_SMISHING + PREFIX_RESERVE + messageText : PREFIX_RESERVE + messageText;
		} else if (isSmishing) {
			return PREFIX_SMISHING + messageText;
		}
		return messageText;
	}

	/**
	 * @카카오톡용 sandName 포맷팅 메서드
	 */
	public static String formatKakaoSandName(KakaoSendAdvcVO sendVO) {
		String userId = sendVO.getUserId();
		String callFrom = sendVO.getCallFrom();
		String msgType = getKakaoMessageTypeLabel(sendVO.getMsgType());
		return String.format("[%s][%s]%s", userId, callFrom, msgType);
	}
	
	/**
	 * 메시지 타입 레이블 반환 (SMS 전용)
	 * 
	 * @param msgType 메시지 타입
	 * @param fileCnt 파일 개수
	 * @return 메시지 타입 레이블
	 */
	public static String getMessageTypeLabel(String msgType, String fileCnt) {
		int fileCount = parseIntOrDefault(fileCnt, 0);

		switch (msgType) {
			case "4":
				return "[단문]";
			case "6":
				return fileCount == 0 ? "[장문]" : "[그림]";
			default:
				return "";
		}
	}

	/**
	 * 카카오톡 메시지 타입 레이블 반환
	 * 
	 * @param msgType 메시지 타입
	 * @return 메시지 타입 레이블
	 */
	public static String getKakaoMessageTypeLabel(String msgType) {
		switch (msgType) {
			case "8":
				return "[알림톡]";
			case "9":
				return "[친구톡]";
			default:
				return "";
		}
	}

	/**
	 * 정수로 변환, 변환 실패 시 기본값 반환
	 * 
	 * @param value        변환할 문자열
	 * @param defaultValue 기본값
	 * @return 변환된 정수 또는 기본값
	 */
	public static int parseIntOrDefault(String value, int defaultValue) {
		try {
			return Integer.parseInt(value);
		} catch (NumberFormatException e) {
			return defaultValue;
		}
	}

	/**
	 * 안전하게 문자열 가져오기 (null 체크)
	 * 
	 * @param value 원본 문자열
	 * @return 원본 문자열 또는 빈 문자열
	 */
	public static String safeGetString(String value) {
		return value == null ? "" : value;
	}
}
