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

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import cokr.xit.fims.cmmn.CrdnSttsHstry;
import cokr.xit.fims.cmmn.CrdnSttsHstryQuery;
import cokr.xit.fims.cmmn.dao.CrdnSttsHstryMapper;
import cokr.xit.foundation.component.AbstractBean;
import cokr.xit.foundation.data.DataObject;

/**단속 상태 이력 정보 관리 Bean
 *
 * <p>상세 설명:
 *
 * <pre>
 * ============ 변경 이력 ============
 * 2023-07-19	JoJH 최초 작성
 * ================================
 * </pre>
 */
@Component("crdnSttsHstryBean")
public class CrdnSttsHstryBean extends AbstractBean {
	/** 단속 상태 이력 정보 DAO */
	@Resource(name = "crdnSttsHstryMapper")
	private CrdnSttsHstryMapper crdnSttsHstryMapper;

	/**지정한 조건에 따라 단속 상태 이력 목록을 조회하여 반환한다.
	 * @param req 단속 상태 이력 조회 조건
	 * @return 단속 상태 이력 목록
	 */
	public List<DataObject> getCrdnSttsHstryList(CrdnSttsHstryQuery req) {
		return crdnSttsHstryMapper.selectCrdnSttsHstryList(req);
	}

	/**지정한 조건에 따라 단속 상태 이력 객체들을 반환한다.
	 * @param req 단속 상태 이력 조회 조건
	 * @return 단속 상태 이력 객체 목록
	 */
	public List<DataObject> getCrdnSttsHstrys(CrdnSttsHstryQuery req) {
		return crdnSttsHstryMapper.selectCrdnSttsHstrys(req);
	}

	/**단속 ID에 따라 마지막 단속 상태 이력 객체를 반환한다.
	 * @param crdnId 단속 ID
	 * @return 단속 상태 이력 객체 목록
	 */
	public DataObject getCrdnSttsHstryInfo(String crdnId, String crdnSttsCd, String useYn) {
		return crdnSttsHstryMapper.selectCrdnSttsHstryInfo(crdnId, crdnSttsCd, useYn);
	}

	/**단속 상태 이력 정보를 등록한다.
	 * @param crdnSttsHstry 단속 상태 이력
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean create(CrdnSttsHstry crdnSttsHstry) {
		if (crdnSttsHstry.getUseYn() == null) {
			crdnSttsHstry.setUseYn("Y");
		}

		return crdnSttsHstryMapper.insertCrdnSttsHstry(crdnSttsHstry) == 1;
	}

	/**단속 상태 이력 정보를 수정한다.
	 * @param crdnSttsHstry 단속 상태 이력
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean update(CrdnSttsHstry crdnSttsHstry) {
		return crdnSttsHstryMapper.updateCrdnSttsHstry(crdnSttsHstry) == 1;
	}

	/**단속 상태 이력 정보를 삭제한다. 단속ID로 입력되면 여러건이 삭제가 가능하다.
	 * @param crdnSttsHstry 단속 상태 이력
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean remove(CrdnSttsHstry crdnSttsHstry) {
		return crdnSttsHstryMapper.deleteCrdnSttsHstry(crdnSttsHstry) >= 1;
	}

	/**단속 대장의 상태 정보를 수정한다.
	 * @param excl 부과제외 대장
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean updateCrdn(CrdnSttsHstry crdnSttsHstry) {
		return crdnSttsHstryMapper.updateCrdnSttsCd(crdnSttsHstry) == 1;
	}

	/**단속 상태 이력 정보를 등록하고, 단속 대장의 단속상태 정보를 수정한다.
	 * @param crdnSttsHstry 단속 상태 이력
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean createHstryUpdateCrdnSttsCd(CrdnSttsHstry crdnSttsHstry) {
		// 사용 여부
		if (crdnSttsHstry.getUseYn() == null) {
			crdnSttsHstry.setUseYn("Y");
		}
		// 단속 상태 변경 일시
		if (isEmpty(crdnSttsHstry.getCrdnSttsChgDt()))
			crdnSttsHstry.setCrdnSttsChgDt(dateFormats.format("yyyyMMddHHmmss", System.currentTimeMillis()));

		// 단속상태이력(TB_CRDN_STTS_HSTRY) 대장을 등록한다.
		int rtnNocs = crdnSttsHstryMapper.insertCrdnSttsHstry(crdnSttsHstry);
		if (rtnNocs != 1)
			throw new RuntimeException("단속상태이력 대장 등록에 실패하였습니다.");
		// 단속(TB_CRDN) 대장을 수정한다.
		rtnNocs = crdnSttsHstryMapper.updateCrdnSttsCd(crdnSttsHstry);
		if (rtnNocs != 1)
			throw new RuntimeException("단속상태이력 정보 등록 중 오류가 발생하였습니다.");

		return true;
	}

    /**단속 상태 이력 정보를 삭제하고, 하고 단속 대장의 단속상태 정보를 수정한다.
     * @param crdnSttsHstry 단속 상태 이력
     * @return 저장 여부
     * <ul><li>저장됐으면 true</li>
     *     <li>그렇지 않으면 false</li>
     * </ul>
     */
    public boolean removeHstryUpdateCrdnSttsCd(CrdnSttsHstry crdnSttsHstry) {
        // 단속 ID에 해당하는 단속상태코드의 단속상태이력(TB_CRDN_STTS_HSTRY) 대장을 조회 한다.
        CrdnSttsHstryQuery req = new CrdnSttsHstryQuery();
        req.setCrdnId(crdnSttsHstry.getCrdnId());
        req.setUseYn("Y");
        req.setOrderBy("CSH.STTS_HSTRY_ID DESC");

        DataObject hstryInfo = crdnSttsHstryMapper.selectCrdnSttsHstryInfo(req);
        if (hstryInfo == null)
            throw new RuntimeException("단속 상태 이력 자료가 존재하지 않습니다.");
        if (!crdnSttsHstry.getCrdnSttsCd().equals(hstryInfo.string("CRDN_STTS_CD")))
            throw new RuntimeException("현재 단속 상태와 마지막 단속 상태 이력 정보가 다릅니다.");

        // 단속상태이력(TB_CRDN_STTS_HSTRY) 대장을 삭제한다.
        crdnSttsHstry.setSttsHstryId(hstryInfo.string("STTS_HSTRY_ID"));        // 상태 이력 ID

        if (crdnSttsHstryMapper.updateCrdnSttsHstry(crdnSttsHstry) != 1)
            throw new RuntimeException("단속상태이력 대장에 이력 수정에 실패하였습니다.");

        // 단속(TB_CRDN) 대장을 수정한다.
        CrdnSttsHstry updtHstry = new CrdnSttsHstry();
        updtHstry.setCrdnId(crdnSttsHstry.getCrdnId());                         // 단속 ID
        updtHstry.setCrdnSttsCd(hstryInfo.string("BFR_STTS_CD"));               // 단속 상태 코드
        updtHstry.setCrdnSttsChgDt(hstryInfo.string("BFR_STTS_CHG_DT"));        // 단속 상태 변경 일시

        if (crdnSttsHstryMapper.updateCrdnSttsCd(updtHstry) != 1)
            throw new RuntimeException("단속상태이력 정보 등록 중 오류가 발생하였습니다.");

        return true;
    }


	/**단속 상태 이력 정보를 삭제하고, 하고 단속 대장의 단속상태 정보를 수정한다.
	 * @param crdnSttsHstry 단속 상태 이력
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean removeHstryUpdateCrdnSttsCd(String crdnId, String crdnSttsCd, String deltSttsCd, String deltEtcCn, boolean insertBfrSttsYn) {
		// 단속 ID에 해당하는 단속상태코드의 단속상태이력(TB_CRDN_STTS_HSTRY) 대장을 조회 한다.
		DataObject hstryInfo = crdnSttsHstryMapper.selectCrdnSttsHstryInfo(crdnId, crdnSttsCd, "Y");
		if (hstryInfo == null)
			throw new RuntimeException("단속상태이력 자료가 존재하지 않습니다.");

		if (!isEmpty(crdnSttsCd)) {
            CrdnSttsHstry crdnSttsHstry = new CrdnSttsHstry();
            crdnSttsHstry.setSttsHstryId(hstryInfo.string("STTS_HSTRY_ID"));    // 상태 이력 ID
			if (isEmpty(deltSttsCd))
                crdnSttsHstry.setEtcCn(deltEtcCn);                              // 기타 내용
            crdnSttsHstry.setUseYn("N");                                        // 사용 여부

			if (crdnSttsHstryMapper.updateCrdnSttsHstry(crdnSttsHstry) != 1)
				throw new RuntimeException("단속상태이력 대장에 이력 수정에 실패하였습니다.");
		}

		// 삭제 단속상태코드가 있다면.. 단속상태이력(TB_CRDN_STTS_HSTRY) 대장을 등록한다.
		if (!isEmpty(deltSttsCd)) {
			// 단속상태가 의견제출접수(31)가 아니면서, 삭제상태코드가 의견제출삭제(92)나 경찰서이첩삭제(97) 일 경우
			if (!crdnSttsCd.equals("31") && "92,97".contains(deltSttsCd)) {
				// 단속상태이력(TB_CRDN_STTS_HSTRY) 대장에서 의견제출접수(31) 이력을 조회후 사용여부를 미사용("N")으로 수정.
			    hstryInfo = crdnSttsHstryMapper.selectCrdnSttsHstryInfo(crdnId, "31", "Y");

				if (hstryInfo == null)
					throw new RuntimeException("단속상태이력에 의견제출 접수 이력이 존재하지 않습니다.");

				CrdnSttsHstry opnnSttsHstry = new CrdnSttsHstry();
				opnnSttsHstry.setSttsHstryId(hstryInfo.string("STTS_HSTRY_ID"));
				opnnSttsHstry.setUseYn("N");

				if (crdnSttsHstryMapper.updateCrdnSttsHstry(opnnSttsHstry) != 1)
					throw new RuntimeException("단속상태이력 대장에 의견제출접수 이력 수정에 실패하였습니다.");
			}

			CrdnSttsHstry deleteSttsHstry = new CrdnSttsHstry();
			deleteSttsHstry.setCrdnId(hstryInfo.string("CRDN_ID"));
			deleteSttsHstry.setBfrSttsCd(hstryInfo.string("CRDN_STTS_CD"));
			deleteSttsHstry.setBfrSttsChgDt(hstryInfo.string("REG_DT"));
			deleteSttsHstry.setCrdnSttsCd(deltSttsCd);
			deleteSttsHstry.setEtcCn(deltEtcCn);
			deleteSttsHstry.setUseYn("N");

			if (crdnSttsHstryMapper.insertCrdnSttsHstry(deleteSttsHstry) != 1)
				throw new RuntimeException("삭제 단속상태이력 정보 등록 중 오류가 발생하였습니다.");
		}

		if (insertBfrSttsYn) {
			// 단속상태이력(TB_CRDN_STTS_HSTRY) 대장을 등록한다.
			CrdnSttsHstry crdnSttsHstry = new CrdnSttsHstry();
			crdnSttsHstry.setCrdnId(hstryInfo.string("CRDN_ID"));
            crdnSttsHstry.setBfrSttsCd(ifEmpty(deltSttsCd, crdnSttsCd));
			crdnSttsHstry.setBfrSttsChgDt(crdnSttsHstry.getCreatedAt());
			crdnSttsHstry.setCrdnSttsCd(hstryInfo.string("BFR_STTS_CD"));
			crdnSttsHstry.setCrdnSttsChgDt(hstryInfo.string("BFR_STTS_CHG_DT"));
			crdnSttsHstry.setUseYn("Y");

			if (!createHstryUpdateCrdnSttsCd(crdnSttsHstry))
				throw new RuntimeException("단속상태이력 정보 등록 중 오류가 발생하였습니다.");
		}

		return true;
	}
}