package cokr.xit.fims.sndb.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.sndb.SndbQuery;
import cokr.xit.fims.sndb.Sndng;
import cokr.xit.fims.sndb.SndngDtl;
import cokr.xit.fims.sndb.Svbtc;
import cokr.xit.fims.sndb.service.Sndb01Service;

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

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

	/**계도장 발송 대상 자료 메인화면(sndb/sndb01/010-main)을 연다.
	 * 조건없는 {@link #getSndngList(SndbQuery) 발송 대장 조회 결과}를 포함시킨다.
	 * @return /sndb/sndb01/010-main
	 */
	public ModelAndView warningSendingTargetMain() {
		ModelAndView mav = new ModelAndView("fims/sndb/sndb01010-main");

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

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

	/**계도장 발송 현황 메인화면(sndb/sndb01/020-main)을 연다.
	 * 조건없는 {@link #getSndngList(SndbQuery) 발송 대장 조회 결과}를 포함시킨다.
	 * @return /sndb/sndb01/020-main
	 */
	public ModelAndView warningSendingStatusMain() {
		ModelAndView mav = new ModelAndView("fims/sndb/sndb01010-main");

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

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

	/**발송 대장 목록을 조회하여 반환한다.<br />
	 * {@link SndngService#getSndngList(SndngQuery)} 참고
	 * @param req 발송 대장 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "sndngList": [발송 대장 목록]
	 *     "sndngStart": 발송 대장 목록 시작 인덱스
	 *     "sndngFetch": 한 번에 가져오는 발송 대장 목록 수
	 *     "sndngTotal": 조회 결과 찾은 전체 발송 대장 수
	 * }</code></pre>
	 */
	@RequestMapping(name = "발송 대장 조회", value = "/010/sndngList.do")
	public ModelAndView getSndngList(SndbQuery req) {
		List<?> result = sndb01Service.getSndngList(setFetchSize(req));

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

	/**발송 대장를 등록한다.
	 * @param sndng 발송 대장 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "발송 대장 등록", value = "/010/createSndng.do")
	public ModelAndView createSndng(Sndng sndng) {
		boolean saved = sndb01Service.createSndng(sndng);

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

	/**발송 대장 정보를 수정한다.
	 * @param sndng 발송 대장 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "발송 대장 수정", value = "/010/updateSndng.do")
	public ModelAndView updateSndng(Sndng sndng) {
		boolean saved = sndb01Service.updateSndng(sndng);

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

	/**지정한 발송 대장를 제거한다.
	 * @param sndngIDs 발송 대장 아이디
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "발송 대장 제거", value = "/010/removeSndng.do")
	public ModelAndView removeSndng(Sndng sndng) {
		boolean saved = sndb01Service.removeSndng(sndng);

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

	/**발송 상세 목록을 조회하여 반환한다.<br />
	 * {@link SndngDtlService#getSndngDtlList(SndbQuery)} 참고
	 * @param req 발송 상세 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "sndngDtlList": [발송 상세 목록]
	 *     "sndngDtlStart": 발송 상세 목록 시작 인덱스
	 *     "sndngDtlFetch": 한 번에 가져오는 발송 상세 목록 수
	 *     "sndngDtlTotal": 조회 결과 찾은 전체 발송 상세 수
	 * }</code></pre>
	 */
	@RequestMapping(name = "발송 상세 조회", value = "/010/sndngDtlList.do")
	public ModelAndView getSndngDtlList(SndbQuery req) {
		List<?> result = sndb01Service.getSndngDtlList(setFetchSize(req));

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

	/**발송 상세를 등록한다.
	 * @param sndngDtl 발송 상세 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "발송 상세 등록", value = "/010/createSndngDtl.do")
	public ModelAndView createSndngDtl(SndngDtl sndngDtl) {
		boolean saved = sndb01Service.createSndngDtl(sndngDtl);

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

	/**발송 상세 정보를 수정한다.
	 * @param sndngDtl 발송 상세 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "발송 상세 수정", value = "/010/updateSndngDtl.do")
	public ModelAndView updateSndngDtl(SndngDtl sndngDtl) {
		boolean saved = sndb01Service.updateSndngDtl(sndngDtl);

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

	/**지정한 발송 상세를 제거한다.
	 * @param sndngDtlIDs 발송 상세 아이디
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "발송 상세 제거", value = "/010/removeSndngDtl.do")
	public ModelAndView removeSndngDtl(SndngDtl sndngDtl) {
		boolean saved = sndb01Service.removeSndngDtl(sndngDtl);

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

	/**공시송달 대장 관리 메인화면(fims/sndb/sndb01120-main)을 연다.
	 * 조건없는 {@link #getSvbtcList(SndbQuery) 공시송달 대장 조회 결과}를 포함시킨다.
	 * @return /svbtc/svbtc-main
	 */
	@RequestMapping(name = "공시송달 대장 메인", value = "/120/main.do")
	public ModelAndView  ServiceByPublicNoticeMain() {
		ModelAndView mav = new ModelAndView("fims/sndb/sndb01120-main");

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

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

	/**공시송달 대장 목록을 조회하여 반환한다.<br />
	 * {@link SvbtcService#getSvbtcList(SndbQuery)} 참고
	 * @param req 공시송달 대장 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "svbtcList": [공시송달 대장 목록]
	 *     "svbtcStart": 공시송달 대장 목록 시작 인덱스
	 *     "svbtcFetch": 한 번에 가져오는 공시송달 대장 목록 수
	 *     "svbtcTotal": 조회 결과 찾은 전체 공시송달 대장 수
	 * }</code></pre>
	 */
	@RequestMapping(name = "공시송달 대장 조회", value = "/120/list.do")
	public ModelAndView getSvbtcList(SndbQuery req) {
		List<?> result = sndb01Service.getSvbtcList(setFetchSize(req));

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

	/**공시송달 대장를 등록한다.
	 * @param svbtc 공시송달 대장 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "공시송달 대장 등록", value = "/120/create.do")
	public ModelAndView createSvbtc(Svbtc svbtc) {
		boolean saved = sndb01Service.createSvbtc(svbtc);

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

	/**공시송달 대장 정보를 수정한다.
	 * @param svbtc 공시송달 대장 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "공시송달 대장 수정", value = "/120/update.do")
	public ModelAndView updateSvbtc(Svbtc svbtc) {
		boolean saved = sndb01Service.updateSvbtc(svbtc);

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

	/**지정한 공시송달 대장를 제거한다.
	 * @param svbtcIDs 공시송달 대장 아이디
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@PostMapping(name = "공시송달 대장 제거", value = "/120/remove.do")
	public ModelAndView removeSvbtc(Svbtc svbtc) {
		boolean saved = sndb01Service.removeSvbtc(svbtc);

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

}
