package cokr.xit.fims.excl.web;

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

import javax.annotation.Resource;

import org.apache.poi.ss.usermodel.CellStyle;
import org.springframework.stereotype.Controller;
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.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.excl.CrdnReReg;
import cokr.xit.fims.excl.LevyExclQuery;
import cokr.xit.fims.excl.service.CrdnReRegService;
import cokr.xit.fims.task.Task;
import cokr.xit.foundation.data.DataObject;

/**단속 재등록 서비스의 웹 컨트롤러
 *
 * <p>상세 설명:
 *
 * <pre>
 * ============ 변경 이력 ============
 * 2023-07-03	JoJH 최초 작성
 * ================================
 * </pre>
 */
@Controller
@RequestMapping(name="단속재등록 관리", value=Excl03Controller.CLASS_URL)
public class Excl03Controller extends ApplicationController {

	public static final String CLASS_URL = "/excl/excl03";

	public class METHOD_URL {
		public static final String
			  crackdownReRegistrationMain		= "/010/main.do"				// 단속 재등록 관리 메인 화면
			, getCrackdownReRegistrationList	= "/010/list.do"				// 단속 재등록 대장 목록 조회
			, createCrackdownReRegistration		= "/010/create.do"				// 단속 재등록 대장 등럭
		;
	}

	/**단속 재등록 서비스*/
	@Resource(name="crdnReRegService")
	private CrdnReRegService crdnReRegService;
	/**설정 정보 Bean */
	@Resource(name="stngBean")
	private StngBean stngBean;

	/**단속 재등록 관리 메인화면(excl03/excl03-main)을 연다.
	 *
	 * @return /fims/excl/excl03010
	 */
	@RequestMapping(name="단속 재등록 관리 메인", value=METHOD_URL.crackdownReRegistrationMain)
	public ModelAndView crackdownReRegistrationMain() {
		// View(jsp)에서 사용할 공통코드를 조회
		Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM054");

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

	/**단속 재등록 목록을 조회하여 반환한다.<br />
	 * {@link CrdnReRegService#getExcl03List(Excl03Query)} 참고
	 * @param req 단속 재등록 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "excl03List": [단속 재등록 목록]
	 *     "excl03Start": 단속 재등록 목록 시작 인덱스
	 *     "excl03Fetch": 한 번에 가져오는 단속 재등록 목록 수
	 *     "excl03Total": 조회 결과 찾은 전체 단속 재등록 수
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="단속 재등록 목록 조회", value=METHOD_URL.getCrackdownReRegistrationList)
	public ModelAndView getCrackdownReRegistrationList(LevyExclQuery req) {
		if (!"xls".equals(req.getDownload())) {
			List<?> result = crdnReRegService.getCrdnReRegList(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 numeric = format.n_nn0();
			CellStyle dateYMD = format.yyyy_mm_dd();
			CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();

			List<DataObject> list = crdnReRegService.getCrdnReRegList(req.setFetchSize(0));

			Map<String,Object> valueMap = new HashMap<String,Object>();
			valueMap.put("업무구분", format.of("TASK_SE_NM").style(center));
			valueMap.put("재등록일자", FormatMaker.yyyy_mm_dd(format, "RE_REG_YMD").style(dateYMD));
			valueMap.put("단속등록구분", format.of("CRDN_REG_SE_NM").style(center));
			valueMap.put("기타내용", format.of("ETC_CN"));
			valueMap.put("단속일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "CRDN_YMD_TM").style(dateDT));
			valueMap.put("차량번호", format.of("VHRNO"));
			valueMap.put("납부자구분", format.of("RTPYR_SE_NM").style(center));
			valueMap.put("납부자번호", format.of("RTPYR_NO").style(center));
			valueMap.put("납부자명", format.of("RTPYR_NM"));
			valueMap.put("단속법정동", format.of("CRDN_STDG_NM"));
			valueMap.put("단속장소", format.of("CRDN_PLC"));
			valueMap.put("상세단속장소", format.of("DTL_CRDN_PLC"));
			valueMap.put("위반항목", format.of("VLTN_ARTCL"));
			valueMap.put("단속원금", format.of("FFNLG_CRDN_AMT").style(numeric));
			valueMap.put("처리상태", format.of("CRDN_STTS_NM"));
			valueMap.put("단속특별구역", format.of("CRDN_SPAREA_NM").style(center));
			valueMap.put("사용연료", format.of("USE_FUEL_NM").style(center));
			valueMap.put("주차가능여부", format.of("PRK_PSBLTY_RSLT_NM").style(center));
			valueMap.put("우편번호", format.of("ZIP").style(center));
			valueMap.put("주소", format.of("ADDR"));
			valueMap.put("상세주소", format.of("DTL_ADDR"));
			valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
			valueMap.put("등록사용자", format.of("RGTR_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"));
		}
	}

	/**단속 재등록를 등록한다.
	 * @param excl03 단속 재등록 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@Task
	@PostMapping(name="단속 재등록 등록", value=METHOD_URL.createCrackdownReRegistration)
	public ModelAndView createCrackdownReRegistration(CrdnReReg crdnReReg) {
		String rtnMsg = crdnReRegService.createCrdnReReg(crdnReReg);

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