package cokr.xit.fims.epst.service.bean;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import cokr.xit.fims.epst.dao.EpostRcptRegMapper;
import cokr.xit.fims.sndb.Sndng;
import cokr.xit.fims.sndb.dao.SndngMapper;
import cokr.xit.fims.cmmn.CmmnUtil;
import cokr.xit.fims.epst.EpostQuery;
import cokr.xit.fims.epst.EpostRcptReg;
import cokr.xit.foundation.component.AbstractBean;
import cokr.xit.foundation.data.DataObject;

/**전자우편 접수 등록 정보 관리 Bean
 *
 * <p>상세 설명:
 *
 * <pre>
 * ============ 변경 이력 ============
 * 2023-10-11	JoJH 최초 작성
 * ================================
 * </pre>
 */
@Component("epostRcptRegBean")
public class EpostRcptRegBean extends AbstractBean {

	/** 전자우편 접수 등록 정보 DAO */
	@Resource(name = "epostRcptRegMapper")
	private EpostRcptRegMapper epostRcptRegMapper;

	/** 발송 대장 정보 DAO */
	@Resource(name = "sndngMapper")
	private SndngMapper sndngMapper;

	/**지정한 조건에 따라 전자우편 접수 등록 목록을 조회하여 반환한다.
	 * @param req 전자우편 접수 등록 조회 조건
	 * @return 전자우편 접수 등록 목록
	 */
	public List<DataObject> getEpostRcptRegList(EpostQuery req) {
		// 사용 여부 확인
		if (req.getUseYn() == null) {
			req.setUseYn("Y");
		}
		// 삭제 여부 확인
		if (req.getDelYn() == null) {
			req.setDelYn("N");
		}
		// 정렬 확인
		if (req.getOrderBy() == null) {
			if (req.getBy() == null) {
				req.setOrderBy("REG_DT");
			} else {
				req.setOrderBy(CmmnUtil.convertCamelCaseToSnakeCase(req.getBy()));
			}
		}

		return epostRcptRegMapper.selectEpostRcptRegList(req);
	}

	/**지정한 조건에 따라 전자우편 접수 등록 객체들을 반환한다.
	 * @param req 전자우편 접수 등록 조회 조건
	 * @return 전자우편 접수 등록 객체 목록
	 */
	public List<DataObject> getEpostRcptRegs(EpostQuery req) {
		// 삭제 여부 확인
		if (req.getDelYn() == null) {
			req.setDelYn("N");
		}
		if (req.getOrderBy() == null) {
			req.setOrderBy("ERR.CON_KEY DESC");
		}
		return epostRcptRegMapper.selectEpostRcptRegs(req);
	}

	/**지정한 조건에 따라 전자우편 접수 등록 정보를 반환한다.
	 * @param req 전자우편 접수 등록 조회 조건
	 * @return 전자우편 접수 등록 정보
	 */
	public DataObject getEpostRcptRegInfo(EpostQuery req) {
		DataObject dataInfo = new DataObject();

		if (req.getCallPurpose().equals("create")) {
			dataInfo.set("SGG_CD", req.getSggCd());
			dataInfo.set("TASK_SE_CD", req.getTaskSeCd());
		} else {
			dataInfo = epostRcptRegMapper.selectEpostRcptRegInfo(req);;
		}

		return dataInfo;
	}

	/**지정한 조건에 따라 전자우편 발송 상태 정보를 반환한다.
	 * @param req 전자우편 접수 등록 조회 조건
	 * @return 전자우편 발송 상태 객체 정보
	 */
	List<DataObject> getEpostRcptRegDtlList(EpostQuery req) {
		// 삭제 여부 확인
		if (req.getDelYn() == null) {
			req.setDelYn("N");
		}
		// 정렬 확인
		if (req.getOrderBy() == null) {
			if (req.getBy() == null) {
				req.setOrderBy("CON_KEY, RGST_NMBR");
			} else {
				req.setOrderBy(CmmnUtil.convertCamelCaseToSnakeCase(req.getBy()));
			}
		}

		return epostRcptRegMapper.selectEpostRcptRegDtlList(req);
	}

	/**등기 번호
	 * @param req
	 * @return 전자우편 접수 등록 객체 목록
	 */
	public String getEpostRgNo(String sggCd, String taskSeCd) {
		return epostRcptRegMapper.selectEpostRgNo(sggCd, taskSeCd);
	}

	/**
	 * @param deptCd 부서 코드
	 * @return 시군구 및 부서 정보 객체
	 */
	public DataObject getDeptSggInfo(String deptCd) {
		return epostRcptRegMapper.selectDeptSggInfo(deptCd);
	}

	/**지정한 조건에 따라 전자우편 CON_KEY 를 반환한다.
	 * @param req 전자우편 접수 등록 조회 조건
	 * @return 전자우편 접수 등록 객체 목록
	 */
	public String getEpostSenderRegSeq(String sndngYmd, String deptCd) {
		String conKey = "";
		if (deptCd.length() == 7) {
			conKey = sndngYmd + "-" + deptCd + "0000";
		} else {
			conKey = sndngYmd + "-" + deptCd;
		}

		return epostRcptRegMapper.selectEpostSenderRegSeq(conKey);
	}

	/**전자우편 접수 등록 정보를 등록한다.
	 * @param epostRcptReg 전자우편 접수 등록
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean create(EpostRcptReg epostRcptReg) {
		return epostRcptRegMapper.insert(epostRcptReg);
	}

	/**전자우편 접수 등록 정보를 수정한다.
	 * @param epostRcptReg 전자우편 접수 등록
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean update(EpostRcptReg epostRcptReg) {
		return epostRcptRegMapper.update(epostRcptReg);
	}

	/**전자우편 접수 등록 정보의 우편 처리 상태 코드를 수정한다.
	 * @param epostRcptReg 전자우편 접수 등록
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public String updatePostPrcsSttsCd(EpostRcptReg epostRcptReg) {
		// 변수 선언
		int rtnNocs = -1;														// 처리 결과 건수

		// 전자우편 접수 등록 정보의 우편 처리 상태 코드를 수정한다.
		epostRcptReg.setPostPrcsSttsCd("02");

		rtnNocs = epostRcptRegMapper.updatePostPrcsSttsCd(epostRcptReg);
		if (rtnNocs != 1) {
			throw new RuntimeException("전자우편 접수등록 정보 수정에 실패하였습니다.");	// 예외를 발생시켜서 DB Rollback
		}

		// 발송 정보의 발송 상태 코드를 수정한다.
		Sndng sndng = new Sndng();
		sndng.setSndngId(epostRcptReg.getSndngId());							// 발송 ID
		sndng.setSndngSttsCd("02");												// 발송 상태 코드

		rtnNocs = sndngMapper.updateSndngSttsCd(sndng);
		if (rtnNocs != 1) {
			throw new RuntimeException("발송상태코드 수정에 실패하였습니다.");	// 예외를 발생시켜서 DB Rollback
		}

		return "[S] 작업이 정상 처리 되었습니다.";
	}

	/**전자우편 접수 등록 정보를 삭제한다.
	 * @param epostRcptReg 전자우편 접수 등록
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public String remove(EpostRcptReg epostRcptReg) {
		// 전자우편 접수 등록 정보를 삭제한다.
		int rtnNocs = epostRcptRegMapper.deleteEpostRcptReg(epostRcptReg);
		if (rtnNocs < 1) {
			throw new RuntimeException("전자우편 접수등록 정보 삭제에 실패하였습니다.");	// 예외를 발생시켜서 DB Rollback
		}

		return "[S] 작업이 정상 처리 되었습니다.";
	}

}
