package incheon.res.rdm.com.msgnlog.service.impl;

import incheon.res.rdm.com.msgnlog.mapper.RdmComMsgnlogMapper;
import incheon.res.rdm.com.msgnlog.service.RdmComMsgnlogService;
import incheon.res.rdm.com.msgnlog.vo.RdmComMsgnlog;
import incheon.res.rdm.com.msgnlog.vo.RdmComMsgnlogVO;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.egovframe.rte.fdl.property.EgovPropertyService;
import org.egovframe.rte.fdl.string.EgovStringUtil;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
@Slf4j
public class RdmComMsgnlogServiceImpl extends EgovAbstractServiceImpl implements RdmComMsgnlogService {
	
	@Resource
	private RdmComMsgnlogMapper rdmComMsgnlogMapper;
	
    @Resource(name = "propertiesService")
    protected EgovPropertyService propertiesService;

	public void insertSMS(RdmComMsgnlogVO vo) throws Exception{
		rdmComMsgnlogMapper.insertSMS(vo);
	}
	
	public void insertEmail(RdmComMsgnlogVO vo) throws Exception{
		rdmComMsgnlogMapper.insertEmail(vo);
	}
	
	public void insertPlanLog(RdmComMsgnlogVO vo) throws Exception{
		rdmComMsgnlogMapper.insertPlanLog(vo);
	}
	
	public void insertDigLog(RdmComMsgnlogVO vo) throws Exception{
		rdmComMsgnlogMapper.insertDigLog(vo);
	}
	
	/**
	 * @MethodDESC : 사용자 정보 조회
	 */
	public RdmComMsgnlog selectUserInfo(RdmComMsgnlogVO vo) throws Exception{
		return rdmComMsgnlogMapper.selectUserInfo(vo);
	}
	
	/**
	 * @MethodDESC : 사업계획서 정보 조회
	 */
	public RdmComMsgnlog selectPlanInfo(RdmComMsgnlogVO vo) throws Exception{
		return rdmComMsgnlogMapper.selectPlanInfo(vo);
	}
	
	/**
	 * @MethodDESC : 허가신청서 정보 조회
	 */
	public RdmComMsgnlog selectDigInfo(RdmComMsgnlogVO vo) throws Exception{
		return rdmComMsgnlogMapper.selectDigInfo(vo);
	}
	
	/**
	 * @MethodDESC : 허가자정보 조회
	 */
	public List selectAdminList(RdmComMsgnlogVO vo) throws Exception{
		return rdmComMsgnlogMapper.selectAdminList(vo);
	}
	
	public void insertPlanMsgNLog2(RdmComMsgnlogVO vo) throws Exception{
		
		String stateCde = nullToString(vo.getStateCde());
		String bpaCde = nullToString(vo.getBizPlanPrcsStts());
		String pkIdn = nullToString(vo.getBizPlanAplyMngNo());
		String seUsrIdn = nullToString(vo.getSeUserAcntMngNo());

		try{
			//상태코드가 넘어올 경우만
			if(EgovStringUtil.isNotEmpty(stateCde)){

				String logText = nullToString(getLogText(stateCde));

				RdmComMsgnlogVO insertPlanParam = new RdmComMsgnlogVO();
				insertPlanParam.setBizPlanAplyMngNo(pkIdn);
				insertPlanParam.setBizPlanPrcsStts(bpaCde);
				insertPlanParam.setUserAcntMngNo(seUsrIdn);

				insertPlanParam.setLogCn(logText);
				rdmComMsgnlogMapper.insertPlanLog(insertPlanParam);
			}
		}catch (DataAccessException dae) {
			log.error("로그 데이터 저장 중 데이터베이스 오류 발생");
			throw new RuntimeException("시스템 오류가 발생하여 로그를 저장할 수 없습니다.", dae);
		} catch (RuntimeException re) {
			log.error("로그 생성 중 비즈니스 로직 오류 발생");
			throw re;
		}
	}
	
	public void insertDigMsgNLog2(RdmComMsgnlogVO vo) throws Exception{

		String stateCde = nullToString(vo.getStateCde());
		String rdhCde = nullToString(vo.getRoadDggPrcsStts());
		String pkIdn = nullToString(vo.getRoadDggMngNo());
		String seUsrIdn = nullToString(vo.getSeUserAcntMngNo());

		try{
			//상태코드가 넘어올 경우만
			if(EgovStringUtil.isNotEmpty(stateCde)){

				String logText = nullToString(getLogText(stateCde));
								
				RdmComMsgnlogVO msgnlogInsertParam = new RdmComMsgnlogVO();
				msgnlogInsertParam.setRoadDggMngNo(pkIdn);
				msgnlogInsertParam.setRoadDggPrcsStts(rdhCde);
				msgnlogInsertParam.setUserAcntMngNo(seUsrIdn);

				msgnlogInsertParam.setLogCn(logText);
				rdmComMsgnlogMapper.insertDigLog(msgnlogInsertParam);
			}
		}catch (DataAccessException dae) {
			log.error("로그 데이터 저장 중 데이터베이스 오류 발생");
			throw new RuntimeException("시스템 오류가 발생하여 로그를 저장할 수 없습니다.", dae);
		} catch (RuntimeException re) {
			log.error("로그 생성 중 비즈니스 로직 오류 발생");
			throw re;
		}
	}

	@Override
	public List selectLogInfo(RdmComMsgnlogVO vo) throws Exception {
		return rdmComMsgnlogMapper.selectLogInfo(vo);
	}

	public String getLogText(String stateCde) {
		String logText = "";
		switch (stateCde){
			case "BPA062":
				logText = "사업계획서가 접수처리 되었습니다.";
				break;
			case "BPA063":
				logText = "사업계획서가 접수처리 취소 되었습니다.";
				break;
			case "BPA064":
				logText = "사업계획서가 보완요청 되었습니다.";
				break;
			case "BPA065":
				logText = "사업계획서의 심의완료 처리 되었습니다.";
				break;
			case "BPA066":
				logText = "사업계획서의 심의완료 처리가 취소 되었습니다.";
				break;
			case "BPA067":
				logText = "사업계획서의 심의의견이 수정/등록 되었습니다.";
				break;
			case "BPA068":
				logText = "사업계획서의 전자결재 요청 되었습니다.";
				break;
			case "BPA069":
				logText = "사업계획서의 보완요청이 취소 되었습니다.";
				break;
			case "RDH104":
				logText = "착공계가 수정되었습니다.";
				break;
			case "RDH105":
				logText = "접수전 보완요청 되었습니다.";
				break;
			case "RDH164":
				logText = "허가신청서의 접수전 보완요청이 취소 되었습니다.";
				break;
			case "RDH165":
				logText = "허가신청서의 보완요청이 취소 되었습니다.";
				break;
			case "RDH201":
				logText = "허가신청서가 접수 되었습니다.";
				break;
			case "RDH202":
				logText = "검토하기로 변경 되었습니다.";
				break;
			case "RDH204":
				logText = "허가신청서가 보완요청 되었습니다.";
				break;
			case "RDH206":
				logText = "검토완료로 상태변경 되었습니다.";
				break;
			case "RDH208":
				logText = "고지서 부과(세외수입연계)  되었습니다.";
				break;
			case "RDH209":
				logText = "허가 되었습니다.";
				break;
			case "RDH210":
				logText = "불허 되었습니다.";
				break;
			case "RDH219":
				logText = "허가신청 현장조사서  전자결재 요청 되었습니다.";
				break;
			case "RDH401":
				logText = "착공계가 수정되었습니다.";
				break;
			case "RDH403":
				logText = "착공계 접수 되었습니다.";
				break;
			case "RDH404":
				logText = "착공계 보완요청 되었습니다.";
				break;
			case "RDH406":
				logText = "착공계 검토완료 되었습니다.";
				break;
			case "RDH463":
				logText = "공사변경 접수 되었습니다.";
				break;
			case "RDH464":
				logText = "공사변경 허가 되었습니다.";
				break;
			case "RDH465":
				logText = "공사변경 불허 되었습니다.";
				break;
			case "RDH466":
				logText = "공사변경 전자결재 요청 되었습니다.";
				break;
			case "RDH467":
				logText = "착공계 전자결재 요청 되었습니다.";
				break;
			case "RDH468":
				logText = "복구의뢰서 접수 되었습니다.";
				break;
			case "RDH469":
				logText = "복구의뢰서 진행등록 되었습니다.";
				break;
			case "RDH470":
				logText = "복구공사 취소 되었습니다.";
				break;
			case "RDH471":
				logText = "복구완료 통보 되었습니다.";
				break;
			case "RDH472":
				logText = "복구의뢰서 전자결재 요청 되었습니다.";
				break;
			case "RDH473":
				logText = "현장관리부 등록 되었습니다.";
				break;
			case "RDH503":
				logText = "준공계 접수 되었습니다.";
				break;
			case "RDH505":
				logText = "준공계 검토의견 작성 되었습니다.";
				break;
			case "RDH509":
				logText = "준공처리 되었습니다.";
				break;
			case "RDH554":
				logText = "준공계 현장감독의견 등록 되었습니다.";
				break;
			case "RDH555":
				logText = "준공계 현장감독의견 수정 되었습니다.";
				break;
			case "RDH556":
				logText = "준공계 검토의견 수정 되었습니다.";
				break;
			case "RDH557":
				logText = "준공계 보완요청 수정되었습니다.";
				break;
			case "RDH558":
				logText = "준공계 현장감독의견 삭제 되었습니다.";
				break;
			case "RDH559":
				logText = "준공계 접수 취소 되었습니다.";
				break;
			case "RDH602":
				logText = "준공계 보완요청 되었습니다.";
				break;
			case "RDH605":
				logText = "준공계 재작성요청 되었습니다.";
				break;
			case "RDH907":
				logText = "허가취소 등록 되었습니다.";
				break;
			case "RDH908":
				logText = "허가신청서 반려 되었습니다.";
				break;
			case "RDH950":
				logText = "허가취소 수정 되었습니다.";
				break;
			case "RDH951":
				logText = "허가취소 전자결재 요청 되었습니다.";
				break;
			case "RDH480":
				logText = "허가신청서 전자결재 요청 되었습니다.";
				break;
			case "RDH481":
				logText = "현장관리부 전자결재 요청 되었습니다.";
				break;
			case "RDH482":
				logText = "준공계 전자결재 요청 되었습니다.";
				break;
			case "RDH483":
				logText = "준공계 현장감독 전자결재 요청 되었습니다.";
				break;
			case "RDH484":
				logText = "준공완료 전자결재 요청 되었습니다.";
				break;
			case "RDH700":
				logText = "전자결재 요청 되었습니다.";
				break;

		}
		return logText;
	}

	public String nullToString(String str) {
		if(str == null)
			return "";
		else
			return str.trim();
	}
}
