package cokr.xit.fims.crdn.web;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.web.servlet.ModelAndView;

import cokr.xit.base.code.CommonCode;
import cokr.xit.base.web.ApplicationController;
import cokr.xit.fims.crdn.Crdn;
import cokr.xit.fims.crdn.CrdnQuery;
import cokr.xit.fims.crdn.dao.GlobalStngMapper;
import cokr.xit.fims.crdn.service.CrdnService;
import cokr.xit.fims.crdn.service.CrdnStngService;
import cokr.xit.foundation.data.DataObject;

/**단속 관리 서비스 웹 컨트롤러.<br />
 * {웹 컨텍스트}/crdn/crdn06 로 접근할 수 있다.
 * @author leebj
 */
public class Crdn06Controller extends ApplicationController {

	public static final String CLASS_URL = "/crdn/crdn06";

	public class METHOD_URL {
		public static final String
			  crackdownManagementMain = "/010/main.do"
			, getCrackdownList = "/010/list.do"
			, removeCrackdown = "/010/remove.do"
			, getCrackdownInfo = "/020/info.do"
			, updateCrackdown = "/020/update.do"
			, getCrackdownStatusInfo = "/030/info.do"
			, updateCrackdownStatus = "/030/update.do"
		;
	}

	@Resource(name="crdnService")
	private CrdnService crdnService;

	@Resource(name="crdnStngService")
	private CrdnStngService crdnStngService;

	@Resource(name="globalStngMapper")
	protected GlobalStngMapper globalStngMapper;

	/** 단속 관리 메인화면을 연다.
	 * @return fims/crdn/crdn06010-main
	 */
	public ModelAndView crackdownManagementMain() {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("fims/crdn/crdn06010-main");
		mav.addObject("pageName", "crdn06010-main");

		Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM002", "FIM003", "FIM005", "FIM010", "FIM022", "FIM026",
				"FIM034", "FIM054");
		mav.addObject("FIM003List", commonCodes.get("FIM003"));
		mav.addObject("FIM005List", commonCodes.get("FIM005"));
		mav.addObject("FIM010List", commonCodes.get("FIM010"));
		mav.addObject("FIM054List", commonCodes.get("FIM054"));
		addCodes(commonCodes, mav, "FIM002", "FIM003", "FIM010", "FIM022", "FIM026", "FIM034");
		return mav;
	}

	/**단속자료 목록을 조회한다.<br />
	 * {@link CrdnService#getCrackdownList(CrdnQuery)} 참고
	 * @param query 단속자료 목록 조회 조건
	 * @return jsonView
	 */
	public ModelAndView getCrackdownList(CrdnQuery query) {
		setFetchSize(query);
		return setCollectionInfo(new ModelAndView("jsonView"), crdnService.getCrackdownList(query),"");
	}

	/**지정한 단속 ID에 해당하는 단속 대장를 제거한다.
	 * @param crdnID 단속 ID
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	public ModelAndView removeCrackdown(Crdn crdn) {
		boolean saved = false;
		String retMessage = crdnService.removeCrackdown(crdn);

		if (retMessage.contains("[S]")) {
			saved = true;
		} else {
			saved = false;
		}

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

	/**지정한 ID의 단속 정보(info)를 반환한다.
	 * @param query 단속 대장 조회 조건
	 * @return fims/crdn/crdn06020-info 또는 jsonView
	 * <pre>{
	 *     "crdnInfo": 단속 정보
	 * }</pre>
	 */
	public ModelAndView getCrackdownInfo(CrdnQuery query) {
		DataObject crdnInfo = crdnService.getCrackdownInfo(query);

		boolean json = jsonResponse();

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

		// 법정동
		mav.addObject("stdgNmList", globalStngMapper.selectStdgNmListForCurrentUser());

		// 공통코드 - 위반 내역 코드
		String vltnByTask = "";

		switch(query.getTaskSeCd()) {
			case "PVS" -> { vltnByTask = "WEB002"; }
			case "BPV" -> { vltnByTask = "FIM005"; }
			case "DPV" -> { vltnByTask = "FIM006"; }
			case "ECA" -> { vltnByTask = "FIM061"; }
		}

		Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM011","FIM053","LVS005",vltnByTask);
		mav.addObject("FIM011List", commonCodes.get("FIM011"));
		mav.addObject("FIM053List", commonCodes.get("FIM053"));
		mav.addObject("LVS005List", commonCodes.get("LVS005"));
		mav.addObject("VLTNList", commonCodes.get(vltnByTask));

		// 단속조
		List<DataObject> teamList = crdnStngService.getTeamList(query);

		// 단속부가정보(TB_CRDN_ADI) 공통코드
		switch(query.getTaskSeCd()) {
			case "PVS" -> {
				commonCodes = getCodesOf("FIM002","FIM007","FIM009");
				mav.addObject("FIM002List", commonCodes.get("FIM002"));
				mav.addObject("FIM007List", commonCodes.get("FIM007"));
				mav.addObject("FIM009List", commonCodes.get("FIM009"));
				mav.addObject("TeamList", teamList);
			}
			case "BPV" -> {
				commonCodes = getCodesOf("FIM002","FIM009");
				mav.addObject("FIM002List", commonCodes.get("FIM002"));
				mav.addObject("FIM009List", commonCodes.get("FIM009"));
				mav.addObject("TeamList", teamList);
			}
			case "DPV" -> {
				commonCodes = getCodesOf("FIM034");
				mav.addObject("FIM034List", commonCodes.get("FIM034"));
			}
			case "ECA" -> { }
		}

		return mav
				.addObject("pageName", "crdn06020")								//
				.addObject("crdnInfo", json ? crdnInfo : toJson(crdnInfo))
		;
	}

	/**지정한 단속 ID에 해당하는 단속 대장를 수정한다.
	 * @param crdnID 단속 ID
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	public ModelAndView updateCrackdown(Crdn crdn) {
		boolean saved = false;
		String retMessage = crdnService.updateCrackdown(crdn);

		if (retMessage.contains("[S]")) {
			saved = true;
		} else {
			saved = false;
		}

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


	/**지정한 ID의 단속 처리 상태 정보(info)를 반환한다.
	 * @param query 단속 대장 조회 조건
	 * @return fims/crdn/crdn06030-info 또는 jsonView
	 * <pre>{
	 *     "crdnInfo": 단속 정보
	 * }</pre>
	 */
	public ModelAndView getCrackdownStatusInfo(CrdnQuery query) {
		DataObject crdnInfo = crdnService.getCrackdownInfo(query);

		boolean json = jsonResponse();

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

		Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM010");

		return mav
				.addObject("pageName", "crdn06030")								//
				.addObject("FIM010List", commonCodes.get("FIM010"))				// 단속 처리 상태 코드(CRDN_STTS_CD)
				.addObject("crdnInfo", json ? crdnInfo : toJson(crdnInfo))
		;
	}

	/**지정한 단속 ID에 해당하는 단속 처리 상태를 수정한다.
	 * @param crdnID 단속 ID
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	public ModelAndView updateCrackdownStatus(Crdn crdn) {
		boolean saved = false;
		String retMessage = crdnService.updateCrackdownStatus(crdn);

		if (retMessage.contains("[S]")) {
			saved = true;
		} else {
			saved = false;
		}

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

}
