package cokr.xit.fims.excl.web;

import java.util.ArrayList;
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.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import cokr.xit.base.code.CommonCode;
import cokr.xit.base.file.FileInfo;
import cokr.xit.base.file.service.FileService;
import cokr.xit.base.file.web.FileInfoFactory;
import cokr.xit.base.web.ApplicationController;
import cokr.xit.fims.excl.OpnnSbmsn;
import cokr.xit.fims.excl.ExclQuery;
import cokr.xit.fims.excl.service.Excl02Service;
import cokr.xit.foundation.data.DataObject;

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

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

	/** 파일 정보 서비스 서비스 */
	@Resource(name="fileService")
	private FileService fileService;

	/**의견제출 대장 관리 메인화면(fims/excl/excl02/010-main)을 연다.
	 *
	 * @return /fims/excl/excl02010
	 */
	public ModelAndView opinionSubmissionMain() {
		ModelAndView mav = new ModelAndView("fims/excl/excl02010-main");

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

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

		return mav.addObject("pageName", "excl02010")							// View(jsp)에서 사용할 id 뒤에 붙일 suffix
				.addObject("urlPrefix", "/excl/excl02")							// URL로 사용할 prefix
				.addObject("infoPrefix", "opnnSbmsn")							// prefix
				.addObject("FIM031List", commonCodes.get("FIM031"))				// 부과 제외 구분 코드(LEVY_EXCL_SE_CD)
				.addObject("FIM054List", commonCodes.get("FIM054"))				// 업무 구분 코드(TASK_SE_CD)
		;
	}

	/**의견제출 대장 목록을 조회하여 반환한다.<br />
	 * {@link Excl02Service#getOpnnSbmsnList(Excl02Query)} 참고
	 * @param req 의견제출 대장 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "opnnSbmsnList": [의견제출 대장 목록]
	 *     "opnnSbmsnStart": 의견제출 대장 목록 시작 인덱스
	 *     "opnnSbmsnFetch": 한 번에 가져오는 의견제출 대장 목록 수
	 *     "opnnSbmsnTotal": 조회 결과 찾은 전체 의견제출 대장 수
	 * }</code></pre>
	 */
	@RequestMapping(name = "의견제출 대장 조회", value = "/010/list.do")
	public ModelAndView getOpnnSbmsnList(ExclQuery req) {
		List<?> result = excl02Service.getOpnnSbmsnList(setFetchSize(req));

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

	/**지정한 ID의 의견제출 정보를 반환한다.
	 * @param opnnId 의견제출 ID
	 * @return fims/excl/excl02020-info 또는 jsonView
	 * <pre>{
	 *     "opnnSbmsnInfo": 의견제출 정보
	 * }</pre>
	 */
	@RequestMapping(name = "의견제출 정보 조회", value = "/020/info.do")
	public ModelAndView getOpnnSbmsnInfo(ExclQuery req) {
		DataObject opnnSbmsnInfo = excl02Service.getOpnnSbmsnInfo(req);

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

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

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

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

			return mav
					.addObject("pageName", "excl02020")
					.addObject("FIM029List", commonCodes.get("FIM029"))			// 접수 구분 코드(RCPT_SE_CD)
					.addObject("FIM030List", commonCodes.get("FIM030"))			// 통보 구분 코드(NTFCTN_SE_CD)
					.addObject("FIM032List", commonCodes.get("FIM032"))			// 소유주 관계 구분 코드(OWNR_REL_CD)
					.addObject("FIM033List", commonCodes.get("FIM033"))			// 의견 제출 구분 코드(OPNN_SBMSN_SE_CD)
					.addObject("FIM054List", commonCodes.get("FIM054"))			// 업무 구분 코드(TASK_SE_CD)
					.addObject("opnnSbmsnInfo", json ? opnnSbmsnInfo : toJson(opnnSbmsnInfo))	// 의견제출 정보
			;
		}
	}

	/**의견제출 대장를 등록한다.
	 * @param opnnSbmsn 의견제출 정보, 이미지 파일 uploadFiles
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name="의견제출 대장 등록", value="/020/create.do")
	public ModelAndView createOpnnSbmsn(OpnnSbmsn opnnSbmsn, MultipartFile[] uploadFiles) {
		// 파일
		List<FileInfo> fileInfoList = new ArrayList<FileInfo>();

		if (uploadFiles != null && uploadFiles.length > 0) {
			fileInfoList = new FileInfoFactory().makeFileInfos(null, uploadFiles);
		}

		boolean saved = false;
		String retMessage = excl02Service.createOpnnSbmsn(opnnSbmsn, fileInfoList);

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

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

	/**의견제출 대장 정보를 수정한다.
	 * @param opnnSbmsn 의견제출 정보, 이미지 파일 uploadFiles
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name="의견제출 대장 수정", value="/020/update.do")
	public ModelAndView updateOpnnSbmsn(OpnnSbmsn opnnSbmsn, MultipartFile[] uploadFiles) {
		// 파일
		List<FileInfo> fileInfoList = new ArrayList<FileInfo>();

		if (uploadFiles != null && uploadFiles.length > 0) {
			fileInfoList = new FileInfoFactory().makeFileInfos(null, uploadFiles);
		}

		boolean saved = false;
		String retMessage = excl02Service.updateOpnnSbmsn(opnnSbmsn, fileInfoList);

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

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

	/**의견제출 대장 답변(상태) 정보를 수정한다.
	 * @param opnnSbmsn 의견제출 대장 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name="의견제출 대장 답변 수정", value="/030/updateAnswer.do")
	public ModelAndView updateOpnnSbmsnAnswer(OpnnSbmsn opnnSbmsn) {
		boolean saved = false;
		String retMessage = excl02Service.updateOpnnSbmsnAnswer(opnnSbmsn);

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

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

	/**지정한 의견제출 대장를 제거한다.
	 * @param opnnSbmsnId 의견제출 대장 Id
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name="의견제출 대장 제거", value="/010/remove.do")
	public ModelAndView removeOpnnSbmsn(OpnnSbmsn opnnSbmsn) {
		boolean saved = false;
		String retMessage = excl02Service.removeOpnnSbmsn(opnnSbmsn);

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

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

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

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

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

	/**지정한 ID의 의견제출 심의 결과 정보를 반환한다.
	 * @param opnnId 의견제출 Id
	 * @return fims/excl/excl02030-info 또는 jsonView
	 * <pre>{
	 *     "opnnSbmsnSttsInfo": 의견제출 정보
	 * }</pre>
	 */
	@RequestMapping(name = "의견제출 심의 결과 처리 조회", value = "/030/info.do")
	public ModelAndView getOpnnSbmsnSttsInfo(ExclQuery req) {
		DataObject opnnSbmsnInfo = excl02Service.getOpnnSbmsnInfo(req);

		boolean json = jsonResponse();

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

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

		return mav
				.addObject("pageName", "excl02030")
				.addObject("FIM019List", commonCodes.get("FIM019"))				// 감경 사유 구분 코드(RDUCT_RSN_CD)
				.addObject("FIM030List", commonCodes.get("FIM030"))				// 통보 구분 코드(NTFCTN_SE_CD)
				.addObject("FIM031List", commonCodes.get("FIM031"))				// 의견 제출 상태 코드(OPNN_SBMSN_STTS_CD)
				.addObject("FIM033List", commonCodes.get("FIM033"))				// 의견 제출 구분 코드(OPNN_SBMSN_SE_CD)
				.addObject("FIM054List", commonCodes.get("FIM054"))				// 업무 구분 코드(TASK_SE_CD)
				.addObject("opnnSbmsnInfo", json ? opnnSbmsnInfo : toJson(opnnSbmsnInfo))
		;
	}

}
