package cokr.xit.fims.excl.web;

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

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import cokr.xit.base.code.CommonCode;
import cokr.xit.base.web.ApplicationController;
import cokr.xit.fims.excl.LevyExcl;
import cokr.xit.fims.excl.ExclQuery;
import cokr.xit.fims.excl.service.Excl01Service;
import cokr.xit.foundation.data.DataObject;

/**부과제외 대장 서비스의 웹 컨트롤러
 *
 * <p>상세 설명:
 *
 * <pre>
 * ============ 변경 이력 ============
 * 2023-06-23	JoJH 최초 작성
 * ================================
 * </pre>
 */
public class Excl01Controller extends ApplicationController {

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

	/**부과제외 대장 관리 메인화면(fims/excl/excl01/010-main)을 연다.
	 *
	 * @return /fims/excl/excl01010
	 */
	public ModelAndView levyExclusionMain() {
		ModelAndView mav = new ModelAndView("fims/excl/excl01010-main");

		// View(jsp)에서 사용할 공통코드를 조회
		Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM021", "FIM022", "FIM054");

		addCodes(commonCodes, mav, "FIM021", "FIM022");

		return mav.addObject("pageName", "excl01010")							// View(jsp)에서 사용할 id 뒤에 붙일 suffix
				.addObject("infoPrefix", "levyExcl")							// prefix
				.addObject("FIM021List", commonCodes.get("FIM021"))				//
				.addObject("FIM054List", commonCodes.get("FIM054"))				// 업무 구분 코드(TASK_SE_CD)
		;
	}

	/**부과제외 대장 목록을 조회하여 반환한다.<br />
	 * {@link LevyExclService#getLevyExclList(ExclQuery)} 참고
	 * @param req 부과제외 대장 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "levyExclList": [부과제외 대장 목록]
	 *     "levyExclStart": 부과제외 대장 목록 시작 인덱스
	 *     "levyExclFetch": 한 번에 가져오는 부과제외 대장 목록 수
	 *     "levyExclTotal": 조회 결과 찾은 전체 부과제외 대장 수
	 * }</code></pre>
	 */
	@RequestMapping(name = "부과제외 대장 조회", value = "/010/list.do")
	public ModelAndView getLevyExclList(ExclQuery req) {
		List<?> result = excl01Service.getLevyExclList(setFetchSize(req));

		return setCollectionInfo(new ModelAndView("jsonView"), result, "levyExcl");
	}

	/**지정한 ID의 부과제외 정보(info)를 반환한다.
	 * @param req 부과제외 대장 조회 조건
	 * @return fims/excl/excl01020-info 또는 jsonView
	 * <pre>{
	 *     "levyExclInfo": 부과제외 정보
	 * }</pre>
	 */
	@RequestMapping(name = "부과제외 정보 조회", value = "/020/info.do")
	public ModelAndView getLevyExclInfo(String saveCallbackFuncName, String savedCallbackFuncName, ExclQuery req) {
		DataObject levyExclInfo = excl01Service.getLevyExclInfo(req);

		// 등록을 호출하였지만 등록된 부과제외 ID가 있는지 확인.
		if (req.getCallPurpose().equals("create") && !levyExclInfo.string("LEVY_EXCL_ID").equals("")) {
			ModelAndView mav = new ModelAndView("jsonView");

			return mav
					.addObject("message", "이미 등록된 부과제외 정보가 있습니다.")
					.addObject("retMessage", "이미 등록된 부과제외 정보가 있습니다.")
			;
		} else {
			boolean json = jsonResponse();

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

			// View(jsp)에서 사용할 공통코드를 조회
			Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM021", "FIM022", "FIM054");

			addCodes(commonCodes, mav, "FIM021", "FIM022", "FIM054");

			return mav
					.addObject("saveCallbackFuncName", saveCallbackFuncName)		//
					.addObject("savedCallbackFuncName", savedCallbackFuncName)		//
					.addObject("pageName", "excl01020")								//
					.addObject("FIM021List", commonCodes.get("FIM021"))				// 부과 제외 구분 코드(LEVY_EXCL_SE_CD)
					.addObject("FIM022List", commonCodes.get("FIM022"))				// 부과 제외 사유 코드(LEVY_EXCL_RSN_CD)
					.addObject("FIM054List", commonCodes.get("FIM054"))				// 업무 구분 코드(TASK_SE_CD)
					.addObject("levyExclInfo", json ? levyExclInfo : toJson(levyExclInfo))
			;
		}
	}

	/**부과제외 대장를 등록한다.
	 * @param levyExcl 부과제외 대장 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "부과제외 대장 등록", value = "/020/create.do")
	public ModelAndView createLevyExcl(LevyExcl levyExcl) {
		boolean saved = false;
		String retMessage = excl01Service.createLevyExcl(levyExcl);

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

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

	/**부과제외 대장 정보를 수정한다.
	 * @param levyExcl 부과제외 대장 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "부과제외 대장 수정", value = "/020/update.do")
	public ModelAndView updateLevyExcl(LevyExcl levyExcl) {
		boolean saved = false;
		String retMessage = excl01Service.updateLevyExcl(levyExcl);

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

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

	/**지정한 부과제외 ID에 해당하는 부과제외 대장를 제거한다.
	 * @param levyExclID 부과제외 대장 아이디
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "부과제외 대장 제거", value = "/010/remove.do")
	public ModelAndView removeLevyExcl(LevyExcl levyExcl) {
		boolean saved = false;
		String retMessage = excl01Service.removeLevyExcl(levyExcl);

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

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

	/**여러 건의 부과제외 ID에 해당하는 부과제외 대장를 제거한다.
	 * @param levyExclIDs 부과제외 아이디
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "부과제외 대장 제거", value = "/010/removes.do")
	public ModelAndView removeLevyExclList(ExclQuery req) {
		boolean saved = false;
		String retMessage = excl01Service.removeLevyExclList(req);

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

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

}
