package cokr.xit.fims.sprt.web;

import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.poi.ss.usermodel.CellStyle;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import cokr.xit.base.code.CommonCode;
import cokr.xit.base.docs.xls.CellDef;
import cokr.xit.base.docs.xls.Format;
import cokr.xit.base.docs.xls.Style;
import cokr.xit.base.docs.xls.XLSWriter;
import cokr.xit.base.web.ApplicationController;
import cokr.xit.fims.cmmn.service.bean.StngBean;
import cokr.xit.fims.cmmn.xls.FormatMaker;
import cokr.xit.fims.cmmn.xls.StyleMaker;
import cokr.xit.fims.sprt.CvlcptDscsn;
import cokr.xit.fims.sprt.CvlcptDscsnQuery;
import cokr.xit.fims.sprt.service.CvlcptDscsnService;
import cokr.xit.fims.task.Task;
import cokr.xit.foundation.data.DataObject;

/**민원 상담 내용 서비스의 웹 컨트롤러
 *
 * <p>상세 설명:
 *
 * <pre>
 * ============ 변경 이력 ============
 * 2023-09-05	JoJH 최초 작성
 * ================================
 * </pre>
 */
@Controller
@RequestMapping(name="민원 상담 내용", value="/sprt/sprt04")
public class Sprt04Controller extends ApplicationController {

	public static final String CLASS_URL = "/sprt/sprt04";

    public class METHOD_URL {
		public static final String
              civilComplaintDiscussionMain      = "/010/main.do"                // 민원 상담 관리 메인 화면
            , getCivilComplaintDiscussionList   = "/010/list.do"                // 민원 상담 내용 대장 목록 조회
            , getCivilComplaintDiscussionNocs   = "/010/nocs.do"                // 민원 상담 내용 건수 조회
            , getCivilComplaintDiscussionInfo   = "/020/info.do"                // 민원 상담 내용 정보 조회
            , createCivilComplaintDiscussion    = "/020/create.do"              // 민원 상담 내용 대장 등럭
            , updateCivilComplaintDiscussion    = "/020/update.do"              // 민원 상담 내용 대장 수정
            , removeCivilComplaintDiscussion    = "/010/remove.do"              // 민원 상담 내용 대장 삭제
        ;
    }

	/**민원 상담 내용 서비스*/
	@Resource(name = "cvlcptDscsnService")
	private CvlcptDscsnService cvlcptDscsnService;

	@Resource(name = "stngBean")
	private StngBean stngBean;

	/**민원 상담 내용 관리 메인화면(fims/sprt/sprt04/010-main)을 연다.
	 *
	 * @return /fims/sprt/sprt04010
	 */
	@RequestMapping(name="민원 상담 내용 메인", value="/010/main.do")
	public ModelAndView civilComplaintDiscussionMain() {
		// View(jsp)에서 사용할 공통코드를 조회
		Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM054");

        return new ModelAndView("fims/sprt/sprt04010-main")
            .addObject("pageName", "sprt04010")                             // View(jsp)에서 사용할 id 뒤에 붙일 suffix
            .addObject("prefixUrl", CLASS_URL)                              // prefixUrl
            .addObject("sggCd", currentUser().getOrgID())                        // 시군구 코드(SGG_CD)
            .addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054")))
		;
	}

	/**민원 상담 내용 목록을 조회하여 반환한다.<br />
	 * {@link CvlcptDscsnService#getCvlcptDscsnList(CvlcptDscsnQuery)} 참고
	 * @param req 민원 상담 내용 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "cvlcptDscsnList": [민원 상담 내용 목록]
	 *     "cvlcptDscsnStart": 민원 상담 내용 목록 시작 인덱스
	 *     "cvlcptDscsnFetch": 한 번에 가져오는 민원 상담 내용 목록 수
	 *     "cvlcptDscsnTotal": 조회 결과 찾은 전체 민원 상담 내용 수
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="민원 상담 대장 목록 조회", value=METHOD_URL.getCivilComplaintDiscussionList)
	public ModelAndView getCivilComplaintDiscussionList(CvlcptDscsnQuery req) {
		if (!"xls".equals(req.getDownload())) {
			List<?> result = cvlcptDscsnService.getCvlcptDscsnList(setFetchSize(req));
            return setPagingInfo(new ModelAndView("jsonView"), result, "");
		} else {
			// 현재 날짜 구하기
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
			String dateTime = dateFormat.format(System.currentTimeMillis());

			List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());

			XLSWriter xlsx = new XLSWriter().worksheet(0);
			Format format = new Format(xlsx);
			CellStyle center = format.cellStyle(Style.CENTER);
			CellStyle dateYMD = format.yyyy_mm_dd();
			CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();

			List<DataObject> list = cvlcptDscsnService.getCvlcptDscsnList(req.setFetchSize(0));

			Map<String,Object> valueMap = new HashMap<String,Object>();
			valueMap.put("민원접수구분", format.of("CVLCPT_RCPT_SE_NM").style(center));
			valueMap.put("상담일자", FormatMaker.yyyy_mm_dd(format, "DSCSN_YMD").style(dateYMD));
			valueMap.put("요일", format.of("WEEK_NM").style(center));
			valueMap.put("성명", format.of("CVLPR_NM").style(center));
			valueMap.put("연락처", format.of("CVLPR_CTTPC").style(center));
			valueMap.put("상담내용", format.of("DSCSN_CN"));
			valueMap.put("차량번호", format.of("VHRNO"));
			valueMap.put("납부자번호", format.of("RTPYR_NO").style(center));
			valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
			valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
			valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
			valueMap.put("수정사용자", format.of("MDFR_NM").style(center));

			CellDef.setValues(cellDefs, valueMap);

			xlsx.cell(0, 0).value("민원상담").value(center).merge(0, cellDefs.size() - 1)
				.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
				.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if(i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));

			return new ModelAndView("downloadView")
				.addObject("download", xlsx.getDownloadable().setFilename("민원상담" + "_목록_" + dateTime + ".xlsx"));
		}
	}

	/**민원 상담 내용 건수를 조회하여 반환한다.<br />
	 * {@link CvlcptDscsnService#getCvlcptDscsnList(CvlcptDscsnQuery)} 참고
	 * @param req 민원 상담 내용 조회 조건
	 * @return jsonView
	 * <pre>{
	 *     "cvlcptDscsnInfo": 민원 상담 정보
	 * }</pre>
	 */
	@Task
	@RequestMapping(name="민원 상담 대장 건수 조회", value=METHOD_URL.getCivilComplaintDiscussionNocs)
	public ModelAndView getCivilComplaintDiscussionNocs(CvlcptDscsnQuery req) {
		DataObject result = cvlcptDscsnService.getCvlcptDscsnNocs(req);

		return new ModelAndView("jsonView")
			.addObject("cvlcptDscsnNocs", jsonResponse() ? result : toJson(result));
	}

	/**지정한 ID의 민원 상담 정보(info)를 반환한다.
	 * @param SprtQuery req
	 * @return fims/sprt/sprt04020-info 또는 jsonView
	 * <pre>{
	 *     "cvlcptDscsnInfo": 민원 상담 정보
	 * }</pre>
	 */
	@Task
	@RequestMapping(name="민원 상담 정보 조회", value=METHOD_URL.getCivilComplaintDiscussionInfo)
	public ModelAndView getCivilComplaintDiscussionInfo(HttpServletRequest hReq, CvlcptDscsnQuery req) {
		DataObject cvlcptDscsnInfo = req.getCvlcptDscsnId() != null ?
			cvlcptDscsnService.getCvlcptDscsnInfo(req) :
			cvlcptDscsnService.getCrdnInfo(req);
		// View(jsp)에서 사용할 공통코드를 조회
		Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM065");

		boolean json = jsonResponse();
		return new ModelAndView(json ? "jsonView" : "fims/sprt/sprt04020-info")
			.addObject("callPurpose", req.getCallPurpose())						    // 호출 용도
			.addObject("pageName", "sprt04020")									    // jsp pageName
			.addObject("prefixUrl", CLASS_URL)								        // prefixUrl
			.addObject("FIM065List", commonCodes.get("FIM065"))					    // 민원 접수 구분 코드(CVLCPT_RCPT_SE_CD)
			.addObject("Info", json ? cvlcptDscsnInfo : toJson(cvlcptDscsnInfo))	// 민원 상담 정보
		;
	}

	/**민원 상담 내용를 등록한다.
	 * @param cvlcptDscsn 민원 상담 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="민원 상담 대장 등록", value=METHOD_URL.createCivilComplaintDiscussion)
	public ModelAndView createCivilComplaintDiscussion(CvlcptDscsn cvlcptDscsn) {
		String rtnMsg = cvlcptDscsnService.createCvlcptDscsn(cvlcptDscsn);

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

	/**민원 상담 내용 정보를 수정한다.
	 * @param cvlcptDscsn 민원 상담 내용 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="민원 상담 대장 수정", value=METHOD_URL.updateCivilComplaintDiscussion)
	public ModelAndView updateCivilComplaintDiscussion(CvlcptDscsn cvlcptDscsn) {
		String rtnMsg = cvlcptDscsnService.updateCvlcptDscsn(cvlcptDscsn);

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

	/**지정한 민원 상담 내용를 제거한다.
	 * @param cvlcptDscsnId 민원 상담 아이디
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="민원 상담 대장 삭제", value=METHOD_URL.removeCivilComplaintDiscussion)
	public ModelAndView removeCivilComplaintDiscussion(CvlcptDscsn cvlcptDscsn) {
		String rtnMsg = cvlcptDscsnService.removeCvlcptDscsn(cvlcptDscsn);

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