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

import java.io.File;
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.crdn.Crdn;
import cokr.xit.fims.crdn.service.bean.CrdnBean;
import cokr.xit.fims.excl.CrdnReReg;
import cokr.xit.fims.excl.ExclQuery;
import cokr.xit.fims.excl.dao.CrdnReRegMapper;
import cokr.xit.foundation.AbstractComponent;
import cokr.xit.foundation.data.DataObject;

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

	/** 단속 재등록 정보 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(ExclQuery req) {
		if (req.getOrderBy() == null) {
			req.setOrderBy("REG_DT");
		}

		return crdnReRegMapper.selectCrdnReRegList(req);
	}

	/**지정한 조건에 따라 단속 재등록 객체들을 반환한다.
	 * @param req 단속 재등록 조회 조건
	 * @return 단속 재등록 객체 목록
	 */
	public List<DataObject> getCrdnReRegs(ExclQuery req) {
		if (req.getOrderBy() == null) {
			req.setOrderBy("REG_DT DESC, RE_REG_ID DESC");
		}

		return crdnReRegMapper.selectCrdnReRegs(req);
	}

	/**단속 재등록 정보를 등록한다.
	 * @param excl03 단속 재등록
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public String createCrdnReReg(CrdnReReg crdnReReg) {
		// 변수 선언
		boolean retSuccess = false;						// DB 처리 결과
		String retMessage = "";							// 처리 결과 메시지

		// 단속 ID로 단속(TB_CRDN) 정보 조회
		ExclQuery req = new ExclQuery();

		req.setCrdnId(crdnReReg.getBfrCrdnId());

		DataObject infoCrdn = crdnReRegMapper.selectCrdn(req);

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

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

		if (!infoCrdnFileList.isEmpty() && infoCrdnFileList.size() > 0) {
			List<File> files = new ArrayList<>();

			for (int iLoop = 0; iLoop < infoCrdnFileList.size(); iLoop++) {
				files.add(new File(infoCrdnFileList.get(iLoop).string("FILE_PATH")));
			}

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

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

		// 재등록 단속 정보(TB_CRDN)
		Crdn newCrdn = new Crdn();

		newCrdn.setSggCd(infoCrdn.string("SGG_CD"));									// 시군구 코드
		newCrdn.setTaskSeCd(infoCrdn.string("TASK_SE_CD"));								// 업무 구분 코드
		newCrdn.setCrdnRegSeCd("03");													// 단속 등록 구분 코드(FIM026) - 재 등록
		newCrdn.setCrdnInptSeCd(infoCrdn.string("CRDN_INPT_SE_CD"));					// 단속 입력 구분 코드
		newCrdn.setCvlcptLinkYn(infoCrdn.string("CVLCPT_LINK_YN"));						// 민원 연계 여부
		newCrdn.setLinkTblNm(infoCrdn.string("LINK_TBL_NM"));							// 연계 테이블 명
		newCrdn.setLinkId(infoCrdn.string("LINK_ID"));									// 연계 ID
		newCrdn.setRtpyrId(infoCrdn.string("RTPYR_ID"));								// 납부자 ID
		newCrdn.setCrdnYmd(infoCrdn.string("CRDN_YMD"));								// 단속 일자
		newCrdn.setCrdnTm(infoCrdn.string("CRDN_TM"));									// 단속 시각
		newCrdn.setVhrno(infoCrdn.string("VHRNO"));										// 차량번호
		newCrdn.setCrdnStdgNm(infoCrdn.string("CRDN_STDG_NM"));							// 단속 법정동 명
		newCrdn.setCrdnRoadNm(infoCrdn.string("CRDN_ROAD_NM"));							// 단속 도로 명
		newCrdn.setCrdnPlc(infoCrdn.string("CRDN_PLC"));								// 단속 장소
		newCrdn.setVltnId(infoCrdn.string("VLTN_ID"));									// 위반 ID
		newCrdn.setVltnCd(infoCrdn.string("VLTN_CD"));									// 위반 코드
		newCrdn.setGpsX(infoCrdn.string("GPS_X"));										// GPS X
		newCrdn.setGpsY(infoCrdn.string("GPS_Y"));										// GPS Y
		newCrdn.setAtchFileCnt(Integer.parseInt(infoCrdn.string("ATCH_FILE_CNT")));		// 첨부 파일 수
		newCrdn.setVin(infoCrdn.string("VIN"));											// 차대번호
		newCrdn.setVhclNm(infoCrdn.string("VHCL_NM"));									// 차량 명
		newCrdn.setVhclColor(infoCrdn.string("VHCL_COLOR"));							// 차량 색상
		newCrdn.setFfnlgCrdnAmt(0);														// 과태료 단속 금액 - 초기 값
		newCrdn.setFfnlgRductRt(infoCrdn.string("FFNLG_RDUCT_RT"));						// 과태료 감경 율
		newCrdn.setFfnlgAmt(0);															// 과태료 금액 - 초기 값
//		newCrdn.setAdvntceBgngYmd(""); 													// 사전통지 시작 일자
//		newCrdn.setAdvntceDudtYmd(""); 													// 사전통지 납기 일자
		newCrdn.setAdvntceAmt(0);														// 사전통지 금액 - 초기 값
		newCrdn.setOpnnSbmsnYn("N");													// 의견 제출 여부
		newCrdn.setEtcCn(infoCrdn.string("ETC_CN"));									// 기타 내용
		newCrdn.setCrdnSttsCd("01");													// 단속 상태 코드
		newCrdn.setCrdnSttsChgDt("");													// 단속 상태 변경 일시
		newCrdn.setAdtnAmt(0);															// 가산 금액
		newCrdn.setMinusAmt(0);															// 감경 금액
		newCrdn.setRcvmtAmt(0);															// 수납 금액
		newCrdn.setBfrCrdnId(infoCrdn.string("CRDN_ID"));								// 이전 단속 ID
		newCrdn.setDelYn("N");															// 삭제 여부
		// TB_CRDN_ADI(단속 부가 정보)
		newCrdn.setCrdnSeCd(infoCrdn.string("CRDN_SE_CD"));								// 단속 구분 코드
		newCrdn.setTeamId(infoCrdn.string("TEAM_ID"));									// 조 ID
		newCrdn.setDtlCrdnPlc(infoCrdn.string("DTL_CRDN_PLC"));							// 상세 단속 장소
		newCrdn.setCrdnSpareaCd(infoCrdn.string("CRDN_SPAREA_CD"));						// 단속 특별구역 코드
		newCrdn.setCrdnBgngTm(infoCrdn.string("CRDN_BGNG_TM"));							// 단속 시작 시각
		newCrdn.setCrdnEndTm(infoCrdn.string("CRDN_END_TM"));							// 단속 종료 시각
		newCrdn.setCrdnSn(infoCrdn.string("CRDN_SN"));									// 단속 일련번호
		newCrdn.setMoscX(infoCrdn.string("MOSC_X"));									// 모자이크 X
		newCrdn.setMoscY(infoCrdn.string("MOSC_Y"));									// 모자이크 Y
		newCrdn.setTowngYn(infoCrdn.string("TOWNG_YN"));								// 견인 여부
		newCrdn.setUseFuelCd(infoCrdn.string("USE_FUEL_CD"));							// 사용 연료 코드
		newCrdn.setFfnlgCarmdlCd(infoCrdn.string("FFNLG_CARMDL_CD"));					// 과태료 차종 코드
		newCrdn.setParkngPsbltyRsltCd(infoCrdn.string("PARKNG_PSBLTY_RSLT_CD"));		// 주차 가능 결과 코드
		newCrdn.setVltnNmtm(infoCrdn.string("VLTN_NMTM"));								// 위반 횟수
		newCrdn.setOvtimeYn(infoCrdn.string("OVTIME_YN"));								// 시간외 여부

		// 단속 대장 입력
		retSuccess = crdnBean.create(null, newCrdn, fileInfoList);
		if (!retSuccess) {
			// 예외를 발생시켜서 오류메세지를 보내고 DB Rollback
			throw new RuntimeException("재부과 등록 중 단속대장 등록에 실패하였습니다.");
		}

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

		retSuccess = crdnReRegMapper.insert(crdnReReg);
		if (!retSuccess) {
			// 예외를 발생시켜서 오류메세지를 보내고 DB Rollback
			throw new RuntimeException("재부과 대장 등록에 실패하였습니다.");
		}

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

		return retMessage;
	}

	/**단속 재등록 정보를 삭제한다.
	 * @param excl03 단속 재등록
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	public boolean removeCrdnReReg(CrdnReReg crdnReReg) {
		return crdnReRegMapper.delete(crdnReReg);
	}

	/**지정한 조건에 따라 부과제외 대장 목록을 조회하여 반환한다.
	 * @param req 부과제외 대장 조회 조건
	 * @return 부과제외 대장 목록
	 */
	public DataObject getCrdnInfo(ExclQuery req) {
		return crdnReRegMapper.selectCrdn(req);
	}

}
