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

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import cokr.xit.fims.cmmn.CmmnUtil;
import cokr.xit.fims.levy.Levy;
import cokr.xit.fims.levy.LevyQuery;
import cokr.xit.fims.levy.dao.LevyMapper;
import cokr.xit.fims.rdca.Rdamt;
import cokr.xit.fims.rdca.RdamtQuery;
import cokr.xit.fims.rdca.dao.RdamtMapper;
import cokr.xit.foundation.component.AbstractBean;
import cokr.xit.foundation.data.DataObject;

/**감액 대장 정보 관리 Bean
 *
 * <p>상세 설명:
 *
 * <pre>
 * ============ 변경 이력 ============
 * 2024-02-01	JoJH 최초 작성
 * ================================
 * </pre>
 */
@Component("rdamtBean")
public class RdamtBean extends AbstractBean {

	/** 감액 대장 정보 DAO */
	@Resource(name = "rdamtMapper")
	private RdamtMapper rdamtMapper;

	/** 부과 대장 정보 DAO */
	@Resource(name = "levyMapper")
	private LevyMapper levyMapper;

	/**지정한 조건에 따라 감액 대장 목록을 조회하여 반환한다.
	 * @param req 감액 대장 조회 조건
	 * @return 감액 대장 목록
	 */
	public List<DataObject> getRdamtList(RdamtQuery req) {
		// 삭제 여부 확인
		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 rdamtMapper.selectRdamtList(req);
	}

	/**지정한 조건에 따라 감액 대장 객체들을 반환한다.
	 * @param req 감액 대장 조회 조건
	 * @return 감액 대장 객체 목록
	 */
	public List<DataObject> getRdamts(RdamtQuery req) {
		// 삭제 여부 확인
		if (req.getDelYn() == null) {
			req.setDelYn("N");
		}
		if (req.getOrderBy() == null) {
			req.setOrderBy("R.RDAMT_ID DESC");
		}

		return rdamtMapper.selectRdamts(req);
	}

	/**지정한 조건에 따라 감액 대장 객체 1건을 반환한다.
	 * @param req 감액 대장 조회 조건
	 * @return 감액 대장 객체
	 */
	public DataObject getRdamtInfo(RdamtQuery req) {
		DataObject rdamtInfo = new DataObject();

//		if (req.getCallPurpose().equals("create")) {
//			rdcamtInfo = rdcamtMapper.selectCrdnInfo(req);
//		} else {
			rdamtInfo = rdamtMapper.selectRdamtInfo(req);
//		}

		return rdamtInfo;
	}

	/**감액 대장 정보를 등록한다.
	 * @param rdcamt 감액 대장
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public String createRdamt(Rdamt rdamt) {
		// 변수 선언
		boolean rtnScs = false;					// DB 처리 결과
		int rtnNocs = -1;						// 처리 결과 건수
		String rtnMsg = "";						// 처리 결과 메시지

		// 부과 ID로 부과 정보 조회
		DataObject levyInfo = levyMapper.selectLevyAmt(new LevyQuery().setLevyId(rdamt.getLevyId()));

		// 부과(TB_LEVY) 대장 정보를 수정한다.
        Levy levy = new Levy();
        levy.setLevyId(levyInfo.string("LEVY_ID"));                             // 부과 ID

        if ("02,03,04".contains(rdamt.getRdamtSeCd())) {                       // 02:부과취소, 03:이의신청수용, 04:법원이송
			// 수납금액이 있으면 오류 발생
			if (toInt(levyInfo.get("RCVMT_PCPTAX")) + toInt(levyInfo.get("RCVMT_ADAMT")) > 0) {
				rtnMsg = "[F] 수납금액이 존재합니다.<br>부분 감액으로 진행하시기 바랍니다.";	// 예외를 발생시켜서 DB Rollback
				return rtnMsg;
			}

            levy.setRdamtPcptax(toInt(levyInfo.get("LEVY_PCPTAX")));     // 감액 본세
            levy.setRdamtAdamt(toInt(levyInfo.get("LEVY_ADAMT")));		// 감액 가산금
            levy.setLastAmt(0);													// 최종 금액
            levy.setDudtAftrAmt(0);												// 납기 후 금액
		} else {
            levy.setRdamtPcptax(toInt(levyInfo.get("RDAMT_PCPTAX")) + rdamt.getRdamtPcptax());                   // 감액 본세
            levy.setRdamtAdamt(toInt(levyInfo.get("RDAMT_ADAMT")) + rdamt.getRdamtAdamt());                      // 감액 가산금
            levy.setLastAmt(toInt(levyInfo.get("LAST_AMT")) - rdamt.getRdamtPcptax() - rdamt.getRdamtAdamt());   // 최종 금액
            if (levy.getLastAmt() > 0) {
                levy.setDudtAftrAmt(toInt(levyInfo.get("DUDT_AFTR_AMT")) - rdamt.getRdamtPcptax() - rdamt.getRdamtAdamt());    // 납기 후 금액
            } else {
                levy.setDudtAftrAmt(0);
            }
		}

		rtnNocs = levyMapper.updateLevyRdamt(levy);
		if (rtnNocs != 1) {
			throw new RuntimeException("부과 대장의 감액 금액 수정에 실패하였습니다.");	// 예외를 발생시켜서 DB Rollback
		}

		// 감액(TB_RDAMT) 대장 정보를 등록한다.
		if ("02,03,04".contains(rdamt.getRdamtSeCd())) {						// 02:부과취소, 03:이의신청수용, 04:법원이송
			rdamt.setLastPcptax(toInt(levyInfo.get("LEVY_PCPTAX")));
			rdamt.setLastAdamt(toInt(levyInfo.get("LEVY_ADAMT")));
			rdamt.setRdamtPcptax(toInt(levyInfo.get("LEVY_PCPTAX")));
			rdamt.setRdamtAdamt(toInt(levyInfo.get("LEVY_ADAMT")));
		} else {
			rdamt.setLastPcptax(toInt(levyInfo.get("LAST_PCPTAX")));
			rdamt.setLastAdamt(toInt(levyInfo.get("LAST_ADAMT")));
			rdamt.setRdamtPcptax(rdamt.getRdamtPcptax());
			rdamt.setRdamtAdamt(rdamt.getRdamtAdamt());
		}

		rtnScs = rdamtMapper.insert(rdamt);
		if (!rtnScs) {
			throw new RuntimeException("감액 대장 등록에 실패하였습니다.");	// 예외를 발생시켜서 DB Rollback
		}

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

	/**감액 대장 정보를 수정한다.
	 * @param rdcamt 감액 대장
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public String updateRdamt(Rdamt rdamt) {
		// 감액(TB_RDAMT) 대장 정보를 수정한다.
		boolean rtnScs = rdamtMapper.update(rdamt);
		if (!rtnScs)
			throw new RuntimeException("감액 대장 수정에 실패하였습니다.");	// 예외를 발생시켜서 DB Rollback

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

	/**감액 대장 정보를 삭제한다.
	 * @param rdcamt 감액 대장
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public String removeRdamt(Rdamt rdamt) {
		// 감액(TB_RDAMT) 대장 정보를 삭제한다.
		boolean rtnScs = rdamtMapper.delete(rdamt);
		if (!rtnScs)
			throw new RuntimeException("감액 정보 삭제에 실패하였습니다.");	// 예외를 발생시켜서 DB Rollback

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

}
