package cokr.xit.fims.mngt.web;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import cokr.xit.base.web.ApplicationController;
import cokr.xit.fims.mngt.Schdl;
import cokr.xit.fims.mngt.SchdlQuery;
import cokr.xit.fims.mngt.service.SchdlService;
import cokr.xit.foundation.data.DataObject;

/**일정관리 서비스 웹 컨트롤러.<br />
 * {웹 컨텍스트}/mngt/mngt02 로 접근할 수 있다.
 * @author leebj
 */
@Controller
@RequestMapping(name="일정관리", value=Mngt02Controller.CLASS_URL)
public class Mngt02Controller extends ApplicationController {

	public static final String CLASS_URL = "/mngt/mngt02";

	public class METHOD_URL {
		public static final String
			schdlMain = "/010/main.do",
			getSchdlList = "/010/list.do",
			getSchdlInfo = "/020/info.do",
			create = "/020/create.do",
			update = "/020/update.do",
			remove = "/020/remove.do"
		;
	}

	@Resource(name="schdlService")
	private SchdlService schdlService;

	/** 일정관리 메인화면을 연다.
	 * @return fims/mngt/mngt02010-main
	 */
	@RequestMapping(name="일정관리", value=METHOD_URL.schdlMain)
	public ModelAndView schdlMain() {
		return new ModelAndView("fims/mngt/mngt02010-main")
			.addObject("pageName", "mngt02010");
	}

	/**일정관리 목록을 조회하여 반환한다.<br />
	 * {@link SchdlService#getSchdlList(SchdlQuery)} 참고
	 * @param req 일정관리 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "schdlList": [일정관리 목록]
	 *     "schdlStart": 일정관리 목록 시작 인덱스
	 *     "schdlFetch": 한 번에 가져오는 일정관리 목록 수
	 *     "schdlTotal": 조회 결과 찾은 전체 일정관리 수
	 * }</code></pre>
	 */
	@RequestMapping(name="일정 목록 조회", value=METHOD_URL.getSchdlList)
	public ModelAndView getSchdlList(SchdlQuery req) {
		List<DataObject> list = schdlService.getSchdlList(req.setUserId(currentUser().getId()));

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

	/**일정관리를 조회하여 반환한다.<br />
	 * {@link SchdlService#getSchdlInfo(SchdlQuery)} 참고
	 * @param req 일정관리 조회 조건
	 * @return jsonView
	 */
	@RequestMapping(name="일정 조회", value=METHOD_URL.getSchdlInfo)
	public ModelAndView getSchdlInfo(String schdlId, String schdlBgngYmd, String schdlEndYmd) {
		DataObject info = !isEmpty(schdlId) ? schdlService.getSchdlInfo(schdlId) : null;

		boolean json = jsonResponse();
		return new ModelAndView(json ? "jsonView" : "fims/mngt/mngt02020-info")
			.addObject("pageName", "mngt02020")
			.addObject("schdlInfo", json ? info : toJson(info))
			.addObject("schdlBgngYmd", schdlBgngYmd)
			.addObject("schdlEndYmd", schdlEndYmd);
	}

	/**일정을 등록한다.
	 * @param schdl 일정관리 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@RequestMapping(name="일정 추가", value=METHOD_URL.create)
	public ModelAndView create(Schdl schdl) {
		schdl.setUserId(currentUser().getId());
		String rtnMsg = schdlService.create(schdl);

		return new ModelAndView("jsonView")
			.addObject("saved", rtnMsg.contains("[S]"))
			.addObject("schdlId", schdl.getSchdlId());
	}

	/**일정을 수정한다.
	 * @param schdl 일정관리 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@RequestMapping(name="일정 수정", value=METHOD_URL.update)
	public ModelAndView update(Schdl schdl) {
		schdl.setUserId(currentUser().getId());
		String rtnMsg = schdlService.update(schdl);

		return new ModelAndView("jsonView")
			.addObject("saved", rtnMsg.contains("[S]"));
	}

	/**지정한 일정을 제거한다.
	 * @param schdlIDs 일정관리 아이디
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@RequestMapping(name="일정 삭제", value=METHOD_URL.remove)
	public ModelAndView remove(Schdl schdl) {
		schdl.setUserId(currentUser().getId());
		String rtnMsg = schdlService.remove(schdl);

		return new ModelAndView("jsonView")
			.addObject("saved", rtnMsg.contains("[S]"));
	}
}