package cokr.xit.fims.levy.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.levy.LevyQuery;
import cokr.xit.fims.levy.Rduct;
import cokr.xit.fims.levy.service.Levy02Service;
import cokr.xit.foundation.data.DataObject;

/**과태료 감경 대장 서비스의 웹 컨트롤러
 *
 * <p>상세 설명:
 *
 * <pre>
 * ============ 변경 이력 ============
 * 2023-08-30	JoJH 최초 작성
 * ================================
 * </pre>
 */
public class Levy02Controller extends ApplicationController {

	/**과태료 감경 대장 서비스*/
	@Resource(name = "levy02Service")
	private Levy02Service levy02Service;

	/**과태료 감경 대장 관리 메인화면(levy/levy02010-main)을 연다.
	 * 조건없는 {@link #getRductList(RductQuery) 과태료 감경 대장 조회 결과}를 포함시킨다.
	 * @return /rduct/rduct-main
	 */
	@RequestMapping(name = "과태료 감경 대장 메인", value = "/010/main.do")
	public ModelAndView main() {
		ModelAndView mav = getRductList(new LevyQuery().setPageNum(1));

		mav.setViewName("fims/levy/levy02010-main");
		mav.addObject("pageName","levy02010-main");

		Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM010", "FIM019", "FIM054");
		mav.addObject("FIM054List", commonCodes.get("FIM054"));
		addCodes(commonCodes, mav, "FIM010", "FIM019");

		return mav.addObject("rductList", toJson(mav.getModel().get("rductList")));
	}

	/**과태료 감경 대장 목록을 조회하여 반환한다.<br />
	 * {@link RductService#getRductList(RductQuery)} 참고
	 * @param req 과태료 감경 대장 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "rductList": [과태료 감경 대장 목록]
	 *     "rductStart": 과태료 감경 대장 목록 시작 인덱스
	 *     "rductFetch": 한 번에 가져오는 과태료 감경 대장 목록 수
	 *     "rductTotal": 조회 결과 찾은 전체 과태료 감경 대장 수
	 * }</code></pre>
	 */
	@RequestMapping(name = "과태료 감경 대장 조회", value = "/010/list.do")
	public ModelAndView getRductList(LevyQuery req) {
		List<?> result = levy02Service.getRductList(setFetchSize(req));

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

	/**지정한 ID의 과태료 감경 정보(info)를 반환한다.
	 * @param req 과태료 감경 대장 조회 조건
	 * @return fims/levy/levy02020-info 또는 jsonView
	 * <pre>{
	 *     "rductInfo": 과태료 감경 정보
	 * }</pre>
	 */
	@RequestMapping(name = "과태료 감경 정보 조회", value = "/020/info.do")
	public ModelAndView getRductInfo(LevyQuery req) {
		DataObject rductInfo = levy02Service.getRductInfo(req);

		// 등록을 호출하였지만 등록된 감경 ID가 있는지 확인.
		if (req.getCallPurpose().equals("create") && !rductInfo.string("RDUCT_ID").equals("")) {
			ModelAndView mav = new ModelAndView("jsonView");

			return mav.addObject("retMessage", "이미 등록된 과태료 감경 정보가 있습니다.");
		} else if (req.getCallPurpose().equals("create") && rductInfo.string("RTPYR_ID").equals("")) {
			ModelAndView mav = new ModelAndView("jsonView");

			return mav.addObject("retMessage", "납부자 정보가 없습니다.");
		} else {
			boolean json = jsonResponse();

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

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

			return mav
					.addObject("pageName", "levy02020")
					.addObject("FIM019List", commonCodes.get("FIM019"))			// 감경 사유 구분 코드(RDUCT_RSN_CD)
					.addObject("rductInfo", json ? rductInfo : toJson(rductInfo))
			;
		}
	}

	/**과태료 감경 대장를 등록한다.
	 * @param rduct 과태료 감경 대장 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "과태료 감경 대장 등록", value = "/020/create.do")
	public ModelAndView createRduct(Rduct rduct) {
		boolean saved = false;
		String retMessage = levy02Service.createRduct(rduct);

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

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

	/**과태료 감경 대장 정보를 수정한다.
	 * @param rduct 과태료 감경 대장 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "과태료 감경 대장 수정", value = "/020/update.do")
	public ModelAndView updateRduct(Rduct rduct) {
		boolean saved = false;
		String retMessage = levy02Service.updateRduct(rduct);

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

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

	/**지정한 과태료 감경 대장를 제거한다.
	 * @param rductId 과태료 감경 대장 ID
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "과태료 감경 대장 제거", value = "/010/remove.do")
	public ModelAndView removeRduct(Rduct req) {
		boolean saved = false;
		String retMessage = levy02Service.removeRduct(req);

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

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

	/**여러 건의 과태료 감경 대장를 제거한다.
	 * @param rductIDs 과태료 감경 대장 IDs
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name="의견제출 대장 제거", value="/010/removes.do")
	public ModelAndView removeRducts(LevyQuery req) {
		boolean saved = false;
		String retMessage = levy02Service.removeRducts(req);

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

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

}
