package cokr.xit.fims.sprt.web;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import cokr.xit.base.file.FileInfo;
import cokr.xit.base.file.FileInfo.Relation;
import cokr.xit.base.file.web.FileInfoFactory;
import cokr.xit.base.web.ApplicationController;
import cokr.xit.fims.cmmn.CrdnPayerHstryQuery;
import cokr.xit.fims.cmmn.CrdnSttsHstryQuery;
import cokr.xit.fims.cmmn.service.CrdnPayerHstryService;
import cokr.xit.fims.cmmn.service.CrdnSttsHstryService;
import cokr.xit.fims.crdn.Crdn;
import cokr.xit.fims.excl.ExclQuery;
import cokr.xit.fims.excl.service.Excl01Service;
import cokr.xit.fims.excl.service.Excl02Service;
import cokr.xit.fims.levy.LevyQuery;
import cokr.xit.fims.levy.service.Levy01Service;
import cokr.xit.fims.levy.service.Levy02Service;
import cokr.xit.fims.rcvm.RcvmQuery;
import cokr.xit.fims.rcvm.service.Rcvm01Service;
import cokr.xit.fims.sndb.SndbQuery;
import cokr.xit.fims.sndb.service.Sndb01Service;
import cokr.xit.fims.sprt.SprtQuery;
import cokr.xit.fims.sprt.service.Sprt02Service;
import cokr.xit.fims.sprt.service.Sprt04Service;
import cokr.xit.foundation.data.DataObject;

/**개별총정보 서비스의 웹 컨트롤러
*
* <p>상세 설명:
*
* <pre>
* ============ 변경 이력 ============
* 2023-08-18	JoJH 최초 작성
* ================================
* </pre>
*/
public class Sprt02Controller extends ApplicationController {

	@Resource(name="sprt02Service")
	private Sprt02Service sprt02Service;

	/** 부과제외 대장 서비스 */
	@Resource(name = "excl01Service")
	protected Excl01Service excl01Service;

	/** 의견제출 대장 서비스 */
	@Resource(name = "excl02Service")
	protected Excl02Service excl02Service;

	/** 발송 대장 서비스*/
	@Resource(name = "sndb01Service")
	protected Sndb01Service sndb01Service;

	/** 부과 대장 서비스*/
	@Resource(name = "levy01Service")
	protected Levy01Service levy01Service;

	/** 감경 대장 서비스 */
	@Resource(name = "levy02Service")
	protected Levy02Service levy02Service;

	/** 수납 대장 서비스*/
	@Resource(name = "rcvm01Service")
	protected Rcvm01Service rcvm01Service;

	/** 단속 상태 이력 서비스 */
	@Resource(name = "crdnSttsHstryService")
	private CrdnSttsHstryService crdnSttsHstryService;

	/** 단속 납부자 이력 서비스 */
	@Resource(name = "crdnPayerHstryService")
	private CrdnPayerHstryService crdnPayerHstryService;

	/** 민원 상담 내용 대장 서비스 */
	@Resource(name="sprt04Service")
	private Sprt04Service sprt04Service;

	/**개별 총정보 메인화면(fims/sprt/sprt02/010-main)을 연다.
	 *조건없는 {@link #getCrdnInfo(SprtQuery) 단속 대장 조회 결과}를 포함시킨다.
	 * @return fims/sprt/sprt02010
	 */
	public ModelAndView indivTotalInfoMain(SprtQuery req) {
		DataObject totalInfo = sprt02Service.getCrdnInfo(req);

		boolean json = jsonResponse();

		ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02010-main");

		return mav
				.addObject("callControlName", req.getCallControlName())
				.addObject("pageName", "sprt02010")								// View(jsp)에서 사용할 id 뒤에 붙일 suffix
				.addObject("pageNameMain", "sprt02010")							// 개별총정보 메인 화면명
				.addObject("totalInfo", json ? totalInfo : toJson(totalInfo))	// 개별총정보
		;
	}

	/**지정하는 단속 ID의 단속, 납부자 정보를 반환한다.
	 * @param crdnId 단속ID
	 * @return fims/sprt/sprt02020-main 또는 jsonView
	 * <pre><code> {
	 *     "crdnPayer": {...}
	 * }</code></pre>
	 */
	@RequestMapping(name="단속, 납부자 정보 조회", value="/020/info.do")
	public ModelAndView getCrdnPayerInfo(SprtQuery req) {
		DataObject crdnPayer = sprt02Service.getCrdnPayerInfo(req);

		boolean json = jsonResponse();

		ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02020-info");

		return mav
				.addObject("pageName", "sprt02020")
				.addObject("pageNameMain", "sprt02010")
				.addObject("crdnPayer", json ? crdnPayer : toJson(crdnPayer))	// 단속, 납부자 정보
		;
	}

	/**지정하는 단속 ID의 단속 이미지 파일 정보를 반환한다.
	 * @param crdnId 단속 ID
	 * @return fims/sprt/sprt02020-main 또는 jsonView
	 * <pre><code> {
	 *     "crdnPayer": {...}
	 * }</code></pre>
	 */
	@RequestMapping(name="단속 이미지 파일 정보 조회", value="/020/crdnFileList.do")
	public ModelAndView getCrdnFileList(SprtQuery req) {
		List<DataObject> fileList = sprt02Service.getCrdnFileList(req);

		ModelAndView mav = new ModelAndView("jsonView");

		return mav
				.addObject("pageName", "sprt02020")
				.addObject("pageNameMain", "sprt02010")
				.addObject("fileList", fileList)								// 파일 리스트
		;
	}

	/**단속 이미지 파일 정보를 수정한다.
	 * @param crdn 단속 정보, 추가한 이미지 파일 newFileList, modifyFileList 편집한 이미지 파일
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@RequestMapping(name="단속 이미지 파일 저장", value="/020/updateFile.do")
	public ModelAndView updateCrdnImageFile(Crdn crdn, MultipartFile[] newFileList) {
		boolean saved = false;
		String retMessage = "[F] ";

		List<FileInfo> newFileInfoList = new ArrayList<FileInfo>();
		if (newFileList != null) {
			Relation relation = new Relation();

			relation.setInfoType(Crdn.INF_TYPE);
			relation.setInfoKey(crdn.getCrdnId());

			if (newFileList != null) {
				newFileInfoList = new FileInfoFactory().makeFileInfos(relation, newFileList);
			}
		}

		retMessage = sprt02Service.updateCrdnImageFile(crdn, newFileInfoList);
		if (retMessage.contains("[S]")) {
			saved = true;
		} else {
			saved = false;
		}

		return new ModelAndView("jsonView")
			.addObject("saved", saved)
			.addObject("retMessage", retMessage);
	}

	/**단속 이미지 파일 정보를 삭제한다.
	 * @param crdnId 단속 Id, atchFileCnt 첨부 파일 갯수, fileIDs 파일 IDs
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@RequestMapping(name="단속 이미지 파일 저장", value="/020/removeFile.do")
	public ModelAndView removeCrdnImageFile(String crdnId, String atchFileCnt, String... fileIDs) {
		boolean saved = false;
		String retMessage = "[F] ";
		Integer fileCnt = Integer.parseInt(atchFileCnt);

		retMessage = sprt02Service.removeCrdnImageFile(crdnId, fileCnt, fileIDs);
		if (retMessage.contains("[S]")) {
			saved = true;
		} else {
			saved = false;
		}

		return new ModelAndView("jsonView")
			.addObject("saved", saved)
			.addObject("retMessage", retMessage);
	}

	/**지정하는 단속 ID의 의견제출 정보를 반환한다.
	 * @param crdnId 단속ID
	 * @return fims/sprt/sprt02030-main 또는 jsonView
	 * <pre><code> {
	 *     "opnnSbmsn": {...}
	 * }</code></pre>
	 */
	@RequestMapping(name="의견제출 정보 조회", value="/030/info.do")
	public ModelAndView getOpnnSbmsnInfo(SprtQuery req) {
		// 의견제출(TB_OPNN_SBMSN) 대장 조회
		ExclQuery exclQuery = new ExclQuery();

		if (req.getCallPurpose() == null) {
			exclQuery.setCallPurpose("view");
		} else {
			exclQuery.setCallPurpose(req.getCallPurpose());
		}
		exclQuery.setCrdnId(req.getCrdnId());
		exclQuery.setDelYn(req.getDelYn());

		// 의견 제출(TB_OPNN_SBMSN) 대장 조회
		DataObject opnnSbmsn = excl02Service.getOpnnSbmsnInfo(exclQuery);

		// 단속(TB_CRDN) 대장 조회
		DataObject totalInfo = sprt02Service.getCrdnInfo(req);

		boolean json = jsonResponse();

		ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02030-info");

		return mav
				.addObject("pageName", "sprt02030")
				.addObject("pageNameMain", "sprt02010")
				.addObject("totalInfo", json ? totalInfo : toJson(totalInfo))	// 단속 정보
				.addObject("opnnSbmsn", json ? opnnSbmsn : toJson(opnnSbmsn))	// 의견제출 정보
		;
	}

	/**지정하는 단속 ID의 발송 정보를 반환한다.
	 * @param crdnId 단속ID
	 * @return fims/sprt/sprt02040-main 또는 jsonView
	 * <pre><code> {
	 *     "sndngDtl": {...}
	 * }</code></pre>
	 */
	@RequestMapping(name="발송 정보 조회", value="/040/info.do")
	public ModelAndView getSndngInfo(SprtQuery req) {
		// 발송반송 정보
		SndbQuery sndb01Query = new SndbQuery();

		if (req.getCallPurpose() == null) {
			sndb01Query.setCallPurpose("view");
		} else {
			sndb01Query.setCallPurpose(req.getCallPurpose());
		}
		sndb01Query.setCrdnId(req.getCrdnId());
		sndb01Query.setDelYn(req.getDelYn());
		sndb01Query.setOrderBy("SD.REG_DT, SD.SNDNG_DTL_ID DESC");

		List<?> sndngDtl = sndb01Service.getSndngDtls(sndb01Query);

		// 공시송달 정보
		sndb01Query.setCrdnId(req.getCrdnId());
		sndb01Query.setDelYn(req.getDelYn());
		sndb01Query.setOrderBy("SV.REG_DT DESC, SV.SVBTC_ID DESC");

		List<?> svbtc = sndb01Service.getSvbtcs(sndb01Query);

		boolean json = jsonResponse();

		ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02040-info");

		return mav
				.addObject("pageName", "sprt02040")
				.addObject("pageNameMain", "sprt02010")
				.addObject("infoPrefix", "sndng")								// prefix
				.addObject("sndngDtlList", json ? sndngDtl : toJson(sndngDtl))	// 발송 정보
				.addObject("pageDataName2", "Svbtc")							// dataset2
				.addObject("svbtcList", json ? svbtc : toJson(svbtc))			// 공시송달 정보
		;
	}

	/**지정하는 단속 ID의 처리상태이력, 감경, 부과제외 정보를 반환한다.
	 * @param crdnId 단속ID
	 * @return fims/sprt/sprt02050-main 또는 jsonView
	 * <pre><code> {
	 *     "sndngDtl": {...}
	 * }</code></pre>
	 */
	@RequestMapping(name="처리 상세 정보 조회", value="/050/info.do")
	public ModelAndView getPrcsDtlInfo(SprtQuery req) {
		// 과태료 감경(TB_RDUCT) 대장 조회
		LevyQuery levyQuery = new LevyQuery();

		if (req.getCallPurpose() == null) {
			levyQuery.setCallPurpose("view");
		} else {
			levyQuery.setCallPurpose(req.getCallPurpose());
		}
		levyQuery.setCrdnId(req.getCrdnId());
		levyQuery.setDelYn(req.getDelYn());
		levyQuery.setOrderBy("RDUCT_ID DESC");									// 정렬

		DataObject rduct = levy02Service.getRductInfo(levyQuery);

		// 부과 제외(TB_LEVY_EXCL) 대장 조회
		ExclQuery exclQuery = new ExclQuery();

		if (req.getCallPurpose() == null) {
			exclQuery.setCallPurpose("view");
		} else {
			exclQuery.setCallPurpose(req.getCallPurpose());
		}
		exclQuery.setCrdnId(req.getCrdnId());
		exclQuery.setDelYn(req.getDelYn());
		exclQuery.setOrderBy("LEVY_EXCL_ID DESC");								// 정렬

		DataObject levyExcl = excl01Service.getLevyExclInfo(exclQuery);

		// 단속 상태 이력(TB_CRDN_STTS_HSTRY) 조회
		CrdnSttsHstryQuery crdnSttsHstryQuery = new CrdnSttsHstryQuery();
		crdnSttsHstryQuery.setCrdnId(req.getCrdnId());
		crdnSttsHstryQuery.setOrderBy("CSH.REG_DT DESC, CSH.STTS_HSTRY_ID DESC");

		List<?> crdnSttsHstry = crdnSttsHstryService.getCrdnSttsHstrys(crdnSttsHstryQuery);

		// 단속 납부자 이력(TB_CRDN_PAYER_HSTRY) 조회
		CrdnPayerHstryQuery crdnPayerHstryQuery = new CrdnPayerHstryQuery();
		crdnPayerHstryQuery.setCrdnId(req.getCrdnId());
		crdnPayerHstryQuery.setOrderBy("CPH.REG_DT DESC, CPH.CHG_HSTRY_ID DESC");

		List<?> crdnPayerHstry = crdnPayerHstryService.getCrdnPayerHstrys(crdnPayerHstryQuery);

		// 단속(TB_CRDN) 대장 조회
		DataObject totalInfo = sprt02Service.getCrdnInfo(req);

		boolean json = jsonResponse();

		ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02050-info");

		return mav
				.addObject("pageName", "sprt02050")
				.addObject("pageNameMain", "sprt02010")
				.addObject("totalInfo", json ? totalInfo : toJson(totalInfo))							// 단속 정보
				.addObject("pageDataName1", "Rduct")													// dataset1
				.addObject("rduct", json ? rduct : toJson(rduct))										// 과태료 감경 정보
				.addObject("pageDataName2", "LevyExcl")													// dataset2
				.addObject("levyExcl", json ? levyExcl : toJson(levyExcl))								// 부과 제외 정보
				.addObject("pageDataName3", "CrdnSttsHstry")											// dataset3
				.addObject("crdnSttsHstryList", json ? crdnSttsHstry : toJson(crdnSttsHstry))			// 단속 상태 이력
				.addObject("pageDataName4", "CrdnPayerHstry")											// dataset4
				.addObject("crdnPayerHstryList", json ? crdnPayerHstry : toJson(crdnPayerHstry))		// 단속 납부자 이력
		;
	}

	/**지정하는 단속 ID의 부과, 체납 정보를 반환한다.
	 * @param crdnId 단속ID
	 * @return fims/sprt/sprt02060-main 또는 jsonView
	 * <pre><code> {
	 *     "sndngDtl": {...}
	 * }</code></pre>
	 */
	@RequestMapping(name="부과체납 정보 조회", value="/060/info.do")
	public ModelAndView getLevyNpmntInfo(SprtQuery req) {
		// 감경 조회
		LevyQuery levyQuery = new LevyQuery();

		if (req.getCallPurpose() == null) {
			levyQuery.setCallPurpose("view");
		} else {
			levyQuery.setCallPurpose(req.getCallPurpose());
		}
		levyQuery.setCrdnId(req.getCrdnId());
		levyQuery.setDelYn(req.getDelYn());
		levyQuery.setOrderBy("LEVY_ID DESC");									// 정렬

		DataObject levy = levy01Service.getLevyInfo(levyQuery);

		boolean json = jsonResponse();

		ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02060-info");

		return mav
				.addObject("pageName", "sprt02060")
				.addObject("pageNameMain", "sprt02010")
				.addObject("levy", json ? levy : toJson(levy))					// 부과 정보
		;
	}

	/**지정하는 단속 ID의 수납 정보를 반환한다.
	 * @param crdnId 단속ID
	 * @return fims/sprt/sprt02070-main 또는 jsonView
	 * <pre><code> {
	 *     "rcvmt": {...}
	 * }</code></pre>
	 */
	@RequestMapping(name="수납 정보 조회", value="/070/info.do")
	public ModelAndView getRcvmtInfo(SprtQuery req) {
		RcvmQuery rcvmQuery = new RcvmQuery();

		if (req.getCallPurpose() == null) {
			rcvmQuery.setCallPurpose("view");
		} else {
			rcvmQuery.setCallPurpose(req.getCallPurpose());
		}
		rcvmQuery.setCrdnId(req.getCrdnId());
		rcvmQuery.setDelYn(req.getDelYn());
		rcvmQuery.setOrderBy("R.RCVMT_SN DESC");

		List<DataObject> rcvmt = rcvm01Service.getRcvmts(rcvmQuery);

		boolean json = jsonResponse();

		ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02070-info");

		return mav
				.addObject("pageName", "sprt02070")
				.addObject("pageNameMain", "sprt02010")
				.addObject("infoPrefix", "rcvmt")								// prefix
				.addObject("rcvmt", json ? rcvmt : toJson(rcvmt))				// 수납 정보
		;
	}

	/**지정하는 단속 ID의 민원 상담 내용 정보를 반환한다.
	 * @param crdnId 단속ID
	 * @return fims/sprt/sprt02080-main 또는 jsonView
	 * <pre><code> {
	 *     "cvlcptDscsnCn": {...}
	 * }</code></pre>
	 */
	@RequestMapping(name="민원 상담 정보 조회", value="/080/info.do")
	public ModelAndView getCvlcptDscsnCnInfo(SprtQuery req) {
		if (req.getCallPurpose() == null) {
			req.setCallPurpose("view");
		} else {
			req.setCallPurpose(req.getCallPurpose());
		}

		List<DataObject> cvlcptDscsnCn = sprt04Service.getCvlcptDscsnCns(req);

		boolean json = jsonResponse();

		ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02080-info");

		return mav
				.addObject("pageName", "sprt02080")
				.addObject("pageNameMain", "sprt02010")
				.addObject("infoPrefix", "cvlcptDscsnCn")										// prefix
				.addObject("cvlcptDscsnCn", json ? cvlcptDscsnCn : toJson(cvlcptDscsnCn))		// 민원상담내용 정보
		;
	}

}
