package itn.let.module.base;
 
import java.math.BigDecimal;
import java.math.RoundingMode;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import egovframework.rte.fdl.cmmn.exception.FdlException;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoSendUtil;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.kakao.user.kakaoAt.service.impl.KakaoAlimTalkDAO;
import itn.let.mjo.event.service.MjonEventService;
import itn.let.mjo.event.service.MjonEventVO;
import itn.let.mjo.event.service.impl.MjonEventDAO;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.msgdata.service.impl.MjonMsgDataDAO;
import itn.let.mjo.pay.service.MjonPayVO;
import itn.let.mjo.pay.service.impl.MjonPayDAO;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uss.umt.service.MberManageVO;
import lombok.extern.slf4j.Slf4j;
 
/**
 * 
 * @author 		: 이호영
 * @fileName 	: PriceAndPoint.java 
 * @date 		: 2023.03.27
 * @description : 금액 포인트 관련 module
 * =========================================================== 
 * DATE          AUTHOR   NOTE 
 * ----------------------------------------------------------- *
 * 2023.03.27    이호영          최초 생성
 * 
 * 
 * 
 */
@Slf4j
@Component
public class PriceAndPoint {
 
	@Autowired
	private MjonMsgDataDAO mjonMsgDataDAO;
	
	@Autowired
	private MjonPayDAO mjonPayDAO;
	
	@Autowired
    private MjonEventService mjonEventService;

    @Resource(name = "egovMjonCashIdGnrService")
    private EgovIdGnrService idgenMjonCashId;

	@Resource(name="kakaoAlimTalkDAO")
	private KakaoAlimTalkDAO kakaoAlimTalkDAO;


 
	/** 
	 * @methodName	: getBefCash 
	 * @author		: 이호영
	 * @date		: 2023.03.30 
	 * @description	: 사용자 보유 잔액 
	 * @param userId
	 * @return
	 * @throws Exception 
	 */
	public String getBefCash(String userId) throws Exception {
		MjonMsgVO mjonMsgVO = new MjonMsgVO();
		mjonMsgVO.setUserId(userId);
		return mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO);
	}
 
	/** 
	 * @methodName	: getBefPoint 
	 * @author		: 이호영
	 * @date		: 2023.03.30 
	 * @description	: 사용자 보유 포인트 
	 * @param userId
	 * @return
	 * @throws Exception 
	 */
	public String getBefPoint(String userId) throws Exception {
		MjonMsgVO mjonMsgVO = new MjonMsgVO();
		mjonMsgVO.setUserId(userId);
		return mjonMsgDataDAO.selectBeforePointData(mjonMsgVO);
	}
 
	/** 
	 * @methodName	: getUserMoney 
	 * @author		: 이호영
	 * @date		: 2023.03.30 
	 * @description	: 사용자 보유 잔액 
	 * @param userId
	 * @return
	 * @throws Exception 
	 */
	public BigDecimal getUserMoney(String userId) throws Exception {
		MberManageVO mberManageVO = mjonMsgDataDAO.selectMberManageInfo(userId);
		BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN);
		return userMoney;
	}
 
 
 
	/** 
	 * @methodName	: insertCashAndPoint 
	 * @author		: 이호영
	 * @date		: 2024.03.26 
	 * @description	: 
	 * @param mjonPayDAO
	 * @param idgenMjonCashId
	 * @param userId
	 * @param totPrice
	 * @param memo
	 * @param msgGroupId
	 * @throws Exception 
	 */
	public void insertCashAndPoint(
					 String userId
					, float totPrice
					, String memo
					, String msgGroupId
			) throws Exception {
 
//		MjonPayVO mjonPayVO = new MjonPayVO();
//		mjonPayVO.setCashId(idgenMjonCashId.getNextStringId());
//		mjonPayVO.setUserId(userId);
//		System.out.println(" + totPrice :: "+ totPrice);
//		mjonPayVO.setCash(totPrice);
//		mjonPayVO.setFrstRegisterId(userId);
//		mjonPayVO.setMemo(memo);
//		mjonPayVO.setMsgGroupId(msgGroupId);
 
		insertCashAndPoint(userId, totPrice, memo, msgGroupId, null);
		
//		mjonPayDAO.insertCash(mjonPayVO); //캐시 
//		mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트
		
	}
	/**
	 * @methodName	: insertCashAndPoint 
	 * @author		: 이호영
	 * @date		: 2025. 7. 17.
	 * @description	: insertCashAndPoint 에서 환불으로 인해 userData 추가
	 * @return : void
	 * @param userId
	 * @param totPrice
	 * @param memo
	 * @param msgGroupId
	 * @param userData
	 * @throws Exception
	 * 
	 */
	public void insertCashAndPoint(
			String userId
			, float totPrice
			, String memo
			, String msgGroupId
			, String userData
			) throws Exception {
		
		MjonPayVO mjonPayVO = buildPayVO(userId, totPrice, memo, msgGroupId);

//		 환불로 인해 userData가 추후 사용될 경우 여기에 처리
		 if (StringUtils.isNotEmpty(userData)) { mjonPayVO.setOrderId(userData); }
		
		mjonPayDAO.insertCash(mjonPayVO); //캐시 
		mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트
		
	}
	
	private MjonPayVO buildPayVO(String userId, float totPrice, String memo, String msgGroupId) throws FdlException {
		MjonPayVO vo = new MjonPayVO();
		vo.setCashId(idgenMjonCashId.getNextStringId());
		vo.setUserId(userId);
		vo.setCash(totPrice);
		vo.setFrstRegisterId(userId);
		vo.setMemo(memo);
		vo.setMsgGroupId(msgGroupId);
		System.out.println(" + totPrice :: " + totPrice);
		return vo;
	}

	public void insertBizFtKakaoPrice(String userId, String msgGroupId) throws Exception {
		KakaoVO kakaoVO = new KakaoVO();

		System.out.println("=======================");
		// 사용자 개인 단가 정보 불러오기
		MberManageVO mberManageVO = mjonMsgDataDAO.selectMberManageInfo(userId);
		// 시스템 기본 단가 정보 불러오기
		JoinSettingVO sysJoinSetVO = mjonMsgDataDAO.selectJoinSettingInfo();
		KakaoSendUtil.getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice());
		// TODO Auto-generated method stub
		kakaoVO.setMsgGroupId(msgGroupId);
		
		kakaoVO.setSmsPrice(KakaoSendUtil.getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()));     
		kakaoVO.setMmsPrice(KakaoSendUtil.getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()));       
		kakaoVO.setPicturePrice(KakaoSendUtil.getValidPrice(mberManageVO.getPicturePrice(), sysJoinSetVO.getPicturePrice())); 
		
		kakaoVO.setKakaoFtPrice(KakaoSendUtil.getValidPrice(mberManageVO.getKakaoFtPrice(), sysJoinSetVO.getKakaoFtPrice())); 
		kakaoVO.setKakaoFtImgPrice(KakaoSendUtil.getValidPrice(mberManageVO.getKakaoFtImgPrice(), sysJoinSetVO.getKakaoFtImgPrice())); 
		kakaoVO.setKakaoFtWideImgPrice(KakaoSendUtil.getValidPrice(mberManageVO.getKakaoFtWideImgPrice(), sysJoinSetVO.getKakaoFtWideImgPrice())); 
		
		
		
		kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO);
		
	}

	/**
	 * @methodName	: insertCashAndPoint 
	 * @author		: 이지우
	 * @date		: 2025. 8. 14.
	 * @description	: insertCashAndPoint 에서 updateMemberCash 제외
	 * @return : void
	 * @param userId
	 * @param totPrice
	 * @param memo
	 * @param msgGroupId
	 * @param userData
	 * @throws Exception
	 * 
	 */
	public void insertCashAndPointNoUpdate(
			String userId
			, float totPrice
			, String memo
			, String msgGroupId
			, String userData
			) throws Exception {
		
		MjonPayVO mjonPayVO = buildPayVO(userId, totPrice, memo, msgGroupId);

//		 환불로 인해 userData가 추후 사용될 경우 여기에 처리
		 if (StringUtils.isNotEmpty(userData)) { mjonPayVO.setOrderId(userData); }
		
		mjonPayDAO.insertCash(mjonPayVO); //캐시 
		
	}
 
}