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

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import cokr.xit.base.file.FileInfo;
import cokr.xit.base.file.service.FileQuery;
import cokr.xit.base.file.service.bean.FileBean;
import cokr.xit.base.file.web.FileInfoFactory;
import cokr.xit.fims.cmmn.CmmnUtil;
import cokr.xit.fims.crdn.Crdn;
import cokr.xit.fims.crdn.service.bean.CrdnBean;
import cokr.xit.fims.excl.CrdnReReg;
import cokr.xit.fims.excl.LevyExclQuery;
import cokr.xit.fims.excl.dao.CrdnReRegMapper;
import cokr.xit.foundation.component.AbstractBean;
import cokr.xit.foundation.data.DataObject;

/**단속 재등록 정보 관리 Bean
 *
 * <p>상세 설명: 단속 재등록 대장 DAO(CrdnReRegMapper)를 사용해 업무 기능을 구현한 클래스
 *
 * <pre>
 * ============ 변경 이력 ============
 * 2023-07-03	JoJH 최초 작성
 * ================================
 * </pre>
 */
@Component("crdnReRegBean")
public class CrdnReRegBean extends AbstractBean {
	/** 단속 재등록 정보 DAO */
	@Resource(name = "crdnReRegMapper")
	private CrdnReRegMapper crdnReRegMapper;

	/** 파일 정보 Bean */
	@Resource(name = "fileBean")
	private FileBean fileBean;

	/** 단속 정보 Bean */
	@Resource(name="crdnBean")
	private CrdnBean crdnBean;

	/**지정한 조건에 따라 단속 재등록 목록을 조회하여 반환한다.
	 * @param req 단속 재등록 조회 조건
	 * @return 단속 재등록 목록
	 */
	public List<DataObject> getCrdnReRegList(LevyExclQuery 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 crdnReRegMapper.selectCrdnReRegList(req);
	}

	/**지정한 조건에 따라 단속 재등록 객체들을 반환한다.
	 * @param req 단속 재등록 조회 조건
	 * @return 단속 재등록 객체 목록
	 */
	public List<DataObject> getCrdnReRegs(LevyExclQuery req) {
		// 삭제 여부 확인
		if (req.getDelYn() == null) {
			req.setDelYn("N");
		}
		// 정렬 확인
		if (req.getOrderBy() == null) {
			req.setOrderBy("CRR.RE_REG_ID DESC");
		}

		return crdnReRegMapper.selectCrdnReRegs(req);
	}

	/**단속 재등록 정보를 등록한다.
	 * @param crdnReReg 단속 재등록
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public String createCrdnReReg(CrdnReReg crdnReReg) {
		// 단속 ID로 단속(TB_CRDN) 정보 조회
		DataObject crdnInfo = crdnReRegMapper.selectCrdnInfo(crdnReReg.getBfrCrdnId());

		// 단속 ID로 파일(TB_FILE) 정보 조회
		List<DataObject> crdnFileList = fileBean.getFileList(
			new FileQuery()
				.setInfoType(CrdnReReg.INF_TYPE)
				.setInfoKeys(crdnReReg.getBfrCrdnId())
		);

		// 재등록 단속 파일 정보(TB_FILE)
		List<FileInfo> fileInfoList = new ArrayList<FileInfo>();

		if (!isEmpty(crdnFileList)) {
			List<File> files = new ArrayList<>();

			for (int i = 0; i < crdnFileList.size(); i++) {
				DataObject row = crdnFileList.get(i);
				files.add(new File(row.string("FILE_PATH")));
			}

			fileInfoList = new FileInfoFactory().createFileInfos(null, files);

			// 원본 파일명
            for (int i = 0; i < fileInfoList.size(); i++) {
                fileInfoList.get(i).setName(crdnFileList.get(i).string("FILE_NM"));
            }
		}

		// 현재 날짜 구하기
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");

		// 재등록 단속 정보(TB_CRDN)
		Crdn crdn = new Crdn();
		crdn.setSggCd(crdnInfo.string("SGG_CD"));								// 시군구 코드
		crdn.setTaskSeCd(crdnInfo.string("TASK_SE_CD"));						// 업무 구분 코드
		crdn.setCrdnRegSeCd("03");												// 단속 등록 구분 코드(FIM026) - 재 등록
		crdn.setCrdnInptSeCd(crdnInfo.string("CRDN_INPT_SE_CD"));				// 단속 입력 구분 코드
		crdn.setCvlcptLinkYn(crdnInfo.string("CVLCPT_LINK_YN"));				// 민원 연계 여부
		crdn.setCvlcptLinkTblNm(crdnInfo.string("CVLCPT_LINK_TBL_NM"));			// 민원 연계 테이블 명
		crdn.setCvlcptLinkId(crdnInfo.string("CVLCPT_LINK_ID"));				// 민원 연계 ID
		crdn.setCrdnYmd(crdnInfo.string("CRDN_YMD"));							// 단속 일자
		crdn.setCrdnTm(crdnInfo.string("CRDN_TM"));								// 단속 시각
		crdn.setVhrno(crdnInfo.string("VHRNO"));								// 차량번호
		crdn.setCrdnStdgNm(crdnInfo.string("CRDN_STDG_NM"));					// 단속 법정동 명
		crdn.setCrdnRoadNm(crdnInfo.string("CRDN_ROAD_NM"));					// 단속 도로 명
		crdn.setCrdnPlc(crdnInfo.string("CRDN_PLC"));							// 단속 장소
		crdn.setVltnId(crdnInfo.string("VLTN_ID"));								// 위반 ID
		crdn.setVltnCd(crdnInfo.string("VLTN_CD"));								// 위반 코드
		crdn.setGpsX(crdnInfo.string("GPS_X"));									// GPS X
		crdn.setGpsY(crdnInfo.string("GPS_Y"));									// GPS Y
		crdn.setAtchFileCnt(toInt(crdnInfo.get("ATCH_FILE_CNT")));		// 첨부 파일 수
		crdn.setFfnlgCrdnAmt(toInt(crdnInfo.get("FFNLG_CRDN_AMT")));		// 과태료 단속 금액 - 초기 값
		crdn.setFfnlgAmt(toInt(crdnInfo.get("FFNLG_CRDN_AMT")));			// 과태료 금액 - 초기 값
		crdn.setAdvntceAmt(0);													// 사전통지 금액 - 초기 값
		crdn.setOpnnSbmsnYn("N");												// 의견 제출 여부
		crdn.setEtcCn(crdnInfo.string("ETC_CN"));								// 기타 내용
		crdn.setCrdnSttsCd("01");												// 단속 상태 코드
		crdn.setCrdnSttsChgDt(dateFormat.format(System.currentTimeMillis()));	// 단속 상태 변경 일시
		crdn.setAdtnAmt(0);														// 가산 금액
		crdn.setMinusAmt(0);													// 감경 금액
		crdn.setRcvmtAmt(0);													// 수납 금액
		crdn.setBfrCrdnId(crdnInfo.string("CRDN_ID"));							// 이전 단속 ID
        crdn.setNxrpCrdnLinkYn("N");                                            // 세외수입 단속 연계 여부
		crdn.setDelYn("N");														// 삭제 여부
		// TB_CRDN_ADI(단속 부가 정보)
		crdn.setCrdnSeCd(crdnInfo.string("CRDN_SE_CD"));						// 단속 구분 코드
		crdn.setTeamId(crdnInfo.string("TEAM_ID"));								// 조 ID
		crdn.setDtlCrdnPlc(crdnInfo.string("DTL_CRDN_PLC"));					// 상세 단속 장소
		crdn.setCrdnSpareaCd(crdnInfo.string("CRDN_SPAREA_CD"));				// 단속 특별구역 코드
		crdn.setCrdnBgngTm(crdnInfo.string("CRDN_BGNG_TM"));					// 단속 시작 시각
		crdn.setCrdnEndTm(crdnInfo.string("CRDN_END_TM"));						// 단속 종료 시각
		crdn.setCrdnSn(crdnInfo.string("CRDN_SN"));								// 단속 일련번호
		crdn.setMoscX(crdnInfo.string("MOSC_X"));								// 모자이크 X
		crdn.setMoscY(crdnInfo.string("MOSC_Y"));								// 모자이크 Y
		crdn.setTowngYn(crdnInfo.string("TOWNG_YN"));							// 견인 여부

		// 단속 대장 입력
		boolean rtnScs = crdnBean.create(null, crdn, fileInfoList);
		if (!rtnScs)
			throw new RuntimeException("재부과 등록 중 단속대장 등록에 실패하였습니다.");	// 예외를 발생시켜서 DB Rollback

		// 재부과 대장 등록
		crdnReReg.setCrdnId(crdn.getCrdnId());
		crdnReReg.setCrdnRegSeCd("03");

		int rtnNocs = crdnReRegMapper.insertCrdnReReg(crdnReReg);
		if (rtnNocs != 1)
			throw new RuntimeException("재부과 대장 등록에 실패하였습니다.");	// 예외를 발생시켜서 DB Rollback

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