package itn.com.cmm.util;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.LoginVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.mjo.event.service.MjonEventVO;
import itn.let.mjo.event.service.impl.MjonEventDAO;
import itn.let.mjo.pay.service.MjonPayVO;
import itn.let.mjo.pay.service.impl.MjonPayDAO;
import itn.let.mjo.tax.service.TaxVO;
import itn.let.mjo.tax.service.impl.TaxDAO;
import itn.let.sym.grd.service.MberGrdService;
import itn.let.sym.grd.service.MberGrdVO;
import itn.let.uat.uia.service.impl.MberManageDAO;
import itn.let.uss.umt.service.MberManageVO;

@Component("mjonPayUtil")
public class MjonPayUtil {
	
	@Resource(name="MjonEventDAO")
	private MjonEventDAO mjonEventDAO;
	
	@Resource(name="mberManageDAO")
	private MberManageDAO mberManageDAO;
	
	@Resource(name="mjonPayDAO")
	private MjonPayDAO mjonPayDAO;

	@Resource(name="taxDAO")
	private TaxDAO taxDAO;
	
	/* 등급제 */
	@Resource(name = "mberGrdService")
	MberGrdService mberGrdService;
	
	/**
	 * @param mjonPayVO
	 * @throws Exception
	 */
	public void insertPayUtil(MjonPayVO mjonPayVO) throws Exception {
		
		
		if("anonymousUser".equals(EgovUserDetailsHelper.getAuthenticatedUser() )) {
			
        }else {
        	// 기존 mjonPayVO의 userId 값에 moid 값이 들어가게 되어서 세션에서 아이디를 받아와서 다시 입력하도록 수정함 20220330 우영두
        	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
        	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
        	String buyerName = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());
        	String email = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getEmail());
        	String mobile = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getMoblphonNo());
        	mjonPayVO.setUserId(userId);
        	mjonPayVO.setFrstRegisterId(userId);
        	mjonPayVO.setBuyerName(buyerName);
        	mjonPayVO.setEmail(email);
        	mjonPayVO.setPhone(mobile);
        	mjonPayVO.setMobile(mobile);
        }
		
		
		
		//PG, PGTXT, CASH , 포인트 insert / 회원정보 캐시,포인트 update
		mjonPayDAO.insertMjPg(mjonPayVO); 
		
		//세금계산서,현금영수증 자동발행 체크 / 자동발행 'N'이며 10만원 이상 결제시 현금영수증 의무발행
		MberManageVO mberManageVO = mberManageDAO.selectMber(mjonPayVO.getUserId()); //멤버ID에서 유니크ID로 수정 필요
		
		// 세금계산서 자동발행이고,카드결제가 아닐경우에만 자동발행
		if(("B".equals(mberManageVO.getTaxbillAuto()) || "C".equals(mberManageVO.getTaxbillAuto())) && !"CARD".equals(mjonPayVO.getPayMethod())) {
			TaxVO taxVO = new TaxVO();
			
			/*발행타입 1:소득공제 현금영수증 2:지출증빙 현금영수증 9:세금계산서*/
			String rcptType;
			String regNo="";
			
			if("B".equals(mberManageVO.getTaxbillAuto())) { //세금계산서 기업 자동발행
				rcptType = "9";
				taxVO.setTaxTrgt("B");
				
				regNo = mberManageVO.getTaxBizNo(); //사업자등록번호
				
				taxVO.setCompanyName(mberManageVO.getTaxBzNm());//회사명
				taxVO.setRepName(mberManageVO.getTaxChrmNm());//대표자명
				taxVO.setAddr(mberManageVO.getTaxAddr());//세금계산서 주소
				
			}else if("C".equals(mberManageVO.getTaxbillAuto())) { //세금계산서 개인 자동발행
				rcptType = "9";
				taxVO.setTaxTrgt("C");
				regNo = mberManageVO.getTaxCIhidNum(); // 세금계산서 개인 주민등록번호
				taxVO.setRepName(mberManageVO.getTaxCNm()); //세금계산서 개인 성명
				taxVO.setAddr(mberManageVO.getTaxCAddr()); //세금계산서 개인 주소
				
			} else { //현금영수증 자동발행
				rcptType = mberManageVO.getCashbillType();
			}
			taxVO.setMoid(mjonPayVO.getMoid()); //주문ID
			taxVO.setRcptType(rcptType);//발행타입
			/*발행번호 개인세금계산서:주민등록번호 / 기업세금계산서:사업자번호 / 소득공제현금영수증:휴대폰번호 / 지출증빙현금영수증:사업자번호*/
			taxVO.setRegNo(regNo);
			taxVO.setEmail(mberManageVO.getTaxMngEmail());//담당자이메일
			taxVO.setPhone(mberManageVO.getTaxMngPhoneNum());//담당자 휴대폰번호
			taxVO.setConfirmYn("N"); //완료여부
			taxVO.setFrstRegisterId(mberManageVO.getMberId());

			// JSPark 2022.07.01 => 휴대폰결제는 MJ_TAX 테이블에 인서트 안함
			if(!"CELLPHONE".equals(mjonPayVO.getPayMethod())) {
				taxDAO.insertCashBill(taxVO);
			}
		}
		//세금계산서 자동발행 설정이 아니면서, 결제금액이 10만원 이상인 경우 현금영수증 의무발행 데이터 등록 필요
		if("N".equals(mberManageVO.getTaxbillAuto()) && Integer.parseInt(mjonPayVO.getAmt()) >= 100000 && !"CARD".equals(mjonPayVO.getPayMethod())) {
			//결제금액이 10만원 넘는 경우 : 현금영수증 의무발행 요청 등록
			TaxVO taxVO = new TaxVO();
			
			taxVO.setRcptType("3");//발행타입 : 3, 의무발행
			taxVO.setMoid(mjonPayVO.getMoid());
			taxVO.setRegNo("0100001234");	//의무발행번호
			taxVO.setEmail(mberManageVO.getTaxMngEmail());//담당자이메일
			taxVO.setPhone(mberManageVO.getTaxMngPhoneNum());//담당자 휴대폰번호
			taxVO.setConfirmYn("N"); //완료여부
			taxVO.setFrstRegisterId(mberManageVO.getMberId());

			// JSPark 2022.07.01 => 휴대폰결제는 MJ_TAX 테이블에 인서트 안함
			if(!"CELLPHONE".equals(mjonPayVO.getPayMethod())) {
				taxDAO.insertCashBill(taxVO);
			}
		}
		
		//CASH 테이블
		mjonPayDAO.insertCash(mjonPayVO);  

		//회원정보 CASH 업데이트
		mjonPayDAO.updateMemberCash(mjonPayVO);
		
		// 회원별 등급 적용
		MberGrdVO mberGrdVO = new MberGrdVO();
		mberGrdVO.setMberId(mjonPayVO.getUserId());
    	mberGrdVO.setAmt(mjonPayVO.getAmt());
    	mberGrdVO.setMoid(mjonPayVO.getMoid());
   		mberGrdService.mberGrdSaveByUser(mberGrdVO);
	}
	
	/**
	 * 일반 포인트 등록 Utile
	 * @param mjonPayVO
	 * @throws Exception
	 */
	public void updatePointUtile(MjonPayVO mjonPayVO) throws Exception {
		mjonPayDAO.insertPoint(mjonPayVO);  //POINT 테이블
		mjonPayDAO.updateMemberPoint(mjonPayVO); //회원정보 업데이트
	}
	
	
	/**
	 * 첫 결제 이벤트 포인트 등록 Utile
	 * @param mjonPayVO
	 * @throws Exception
	 */
	public void updateFirstEventPointUtile(MjonPayVO mjonPayVO) throws Exception {
		
		/**
		 * 이벤트 페이지에서 넘어온 경우에만 이벤트 결제로 취급
		 * 이벤트 대상자인 경우 이벤트 회원 정보에 결제 금액 및 이벤트 시작일/종료일, 상태값 변경
		 * 
		 * */
		
		int payCash = (int) mjonPayVO.getCash();
		int limitCash = 500000; //이벤트 참여 최대 금액 50만원으로 설정
		
		//이벤트 대상자인 경우에는 포인트를 무조건 지급하지 않는다.
		//차후에 민원이 제가되면 해당 민원인만 관리자가 포인트를 별도 지급하도록 하기로 함.
		mjonPayVO.setPoint(0);
		mjonPayVO.setPointMemo("첫 결제 이벤트로 인한 포인트 미지급 0원으로 지급처리함.");
		mjonPayDAO.insertPoint(mjonPayVO);  //POINT 테이블
		mjonPayDAO.updateMemberPoint(mjonPayVO); //회원정보 업데이트
		
		if(payCash >= limitCash) {
			//결제금액이 50만원을 넘었기 때문에 50만원만 이벤트 캐시로 충전한다.
			//포인트는 미지급 한다.
			payCash = 500000;
		}
		
		//이벤트 회원 테이블 정보 업데이트
		int resultCnt = updateEventMberInfo(mjonPayVO, payCash);
		System.out.println(resultCnt);
		
	}
	
	/**
	 * 첫 결제 이벤트 회원 테이블 정보 업데이트
	 * 이벤트 시작일, 종료일, 상태정보, 결제 금액, 잔여금액 등 정보 업데이트
	 * 
	 * */
	public int updateEventMberInfo(MjonPayVO mjonPayVO, int payCash) throws Exception {
		
		int resultCnt = 0;
		try {
			
			//이벤트 회원 정보 업데이트
			MjonEventVO updtEventVO = new MjonEventVO();
			updtEventVO.setMberId(mjonPayVO.getUserId());
			updtEventVO.setEventFrstCash(payCash);		//결제 Cash(부가세 뺀 금액)
			updtEventVO.setEventRemainCash(payCash);	//초기 금액을 결제 Cash(부가세 뺀 금액)로 설정
			updtEventVO.setEventPgMoid(mjonPayVO.getMoid()); //결제 Moid 번호
			
			/**
			 * 이벤트 시작일 및 종료일 셋팅
			 * 현재일로 부터 2개월 설정
			 * DB -> datetime
			 * 
			 * */
			
			String nowDate = MJUtil.getRealTime();
			String eventEndDate = MJUtil.getAfterTimerMonth(2);
			
			updtEventVO.setEventStartDate(nowDate);//이벤트 시작일자 설정
			updtEventVO.setEventEndDate(eventEndDate);//이벤트 종료일자 설정
			updtEventVO.setEventStatus("Y");//이벤트 상태를 진행 중으로 변경
			
			resultCnt = mjonEventDAO.updateEventMberStatusInfo(updtEventVO);
			
		} catch (Exception e) {
			System.out.println("+++++++++++++ updateEventMberInfo ServiceImple Error !!! "+e);
		}
		return resultCnt;
	}
}
