package cokr.xit.fims.sprt.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.cmmn.CrdnSttsHstryQuery;
import cokr.xit.fims.cmmn.service.CrdnSttsHstryService;
import cokr.xit.fims.excl.LevyExclQuery;
import cokr.xit.fims.excl.service.LevyExclService;
import cokr.xit.fims.excl.service.OpnnSbmsnService;
import cokr.xit.fims.levy.LevyQuery;
import cokr.xit.fims.levy.service.LevyService;
import cokr.xit.fims.levy.service.RdctService;
import cokr.xit.fims.payer.PayerQuery;
import cokr.xit.fims.payer.service.PayerService;
import cokr.xit.fims.rcvm.RcvmtQuery;
import cokr.xit.fims.rcvm.service.RcvmtService;
import cokr.xit.fims.sndb.SndbQuery;
import cokr.xit.fims.sndb.service.SndngDtlService;
import cokr.xit.fims.sndb.service.SndngService;
import cokr.xit.fims.sndb.service.SvbtcService;
import cokr.xit.fims.sprt.CvlcptDscsnQuery;
import cokr.xit.fims.sprt.SprtQuery;
import cokr.xit.fims.sprt.service.CvlcptDscsnService;
import cokr.xit.fims.sprt.service.Sprt02Service;
import cokr.xit.fims.task.Task;
import cokr.xit.foundation.data.DataObject;

/**개별총정보 서비스의 웹 컨트롤러
*
* <p>상세 설명:
*
* <pre>
* ============ 변경 이력 ============
* 2023-08-18	JoJH 최초 작성
* ================================
* </pre>
*/
@Controller
@RequestMapping(name="개별 총정보", value=Sprt02Controller.CLASS_URL)
public class Sprt02Controller extends ApplicationController {

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

    public class METHOD_URL {
        public static final String
              indivTotalInfoMain				= "/010/main.do"				// 개별 총정보 메인 화면
            , getCrdnPayerInfo					= "/020/info.do"				// 단속, 납부자 정보 조회
            , getCrdnFileList					= "/020/crdnFileList.do"		// 단속 이미지 파일 정보 조회
            , updateCrdnImageFile				= "/020/updateFile.do"			// 단속 이미지 파일 저장
            , removeCrdnImageFile				= "/020/removeFile.do"			// 단속 이미지 파일 삭제
            , getOpnnSbmsnInfo					= "/030/info.do"				// 의견제출 정보 조회
            , getSndngInfo						= "/040/info.do"				// 발송, 반송 정보 조회
            , getPrcsDtlInfo					= "/050/info.do"				// 처리 상세 정보 조회
            , getLevyNpmntInfo					= "/060/info.do"				// 부과체납 정보 조회
            , getRcvmtInfo						= "/070/info.do"				// 수납 정보 조회
            , getCvlcptDscsnInfo				= "/080/info.do"				// 민원 상담 정보 조회
        ;
    }

    /** 개별총정보 서비스*/
    @Resource(name = "sprt02Service")
    private Sprt02Service sprt02Service;
    /** 부과제외 대장 서비스 */
    @Resource(name = "levyExclService")
    protected LevyExclService levyExclService;
    /** 의견제출 대장 서비스 */
    @Resource(name = "opnnSbmsnService")
    protected OpnnSbmsnService opnnSbmsnService;
    /** 발송 대장 서비스*/
    @Resource(name = "sndngService")
    protected SndngService sndngService;
    /** 발송 상세 대장 서비스*/
    @Resource(name = "sndngDtlService")
    protected SndngDtlService sndngDtlService;
    /** 공시송달 대장 서비스*/
    @Resource(name = "svbtcService")
    private SvbtcService svbtcService;
    /** 부과 대장 서비스*/
    @Resource(name = "levyService")
    protected LevyService levyService;
    /** 감경 대장 서비스 */
    @Resource(name = "rdctService")
    protected RdctService rdctService;
    /** 수납 대장 서비스*/
    @Resource(name = "rcvmtService")
    protected RcvmtService rcvmtService;
    /** 단속 상태 이력 서비스 */
    @Resource(name = "crdnSttsHstryService")
    private CrdnSttsHstryService crdnSttsHstryService;
    /** 납부자 서비스*/
    @Resource(name = "payerService")
    private PayerService payerService;
    /** 민원 상담 내용 대장 서비스 */
    @Resource(name = "cvlcptDscsnService")
    private CvlcptDscsnService cvlcptDscsnService;

    /**개별 총정보 메인화면(fims/sprt/sprt02/010-main)을 연다.
     * 조건없는 {@link #getCrdnInfo(SprtQuery) 단속 대장 조회 결과}를 포함시킨다.
     * @return fims/sprt/sprt02010
     */
    @Task("CMN")
    @RequestMapping(name="개별총정보 메인", value=METHOD_URL.indivTotalInfoMain)
    public ModelAndView indivTotalInfoMain(SprtQuery req) {
        // 개별총정보 메인 정보
        DataObject info = sprt02Service.getCrdnInfo(req);

        boolean json = jsonResponse();
        return new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02010-main")
            .addObject("callPageName", req.getCallPageName())               // 호출 pageName
            .addObject("callPurpose", req.getCallPurpose())                 // 호출 용도
            .addObject("pageName", "sprt02010")                             // View(jsp)에서 사용할 id 뒤에 붙일 suffix
            .addObject("totalInfo", json ? info : toJson(info))             // 개별총정보
        ;
    }

    /**지정하는 단속 ID의 단속, 납부자 정보를 반환한다.
     * @param crdnId 단속ID
     * @return fims/sprt/sprt02020-main 또는 jsonView
     * <pre><code> {
     *     "crdnPayer": {...}
     * }</code></pre>
     */
    @Task
    @RequestMapping(name="개별총정보 단속,납부자 정보 조회", value=METHOD_URL.getCrdnPayerInfo)
    public ModelAndView getCrdnPayerInfo(SprtQuery req) {
        // 단속(TB_CRDN), 납부자(TB_PAYER) 정보
        DataObject crdnPayerInfo = sprt02Service.getCrdnPayerInfo(req);

        boolean json = jsonResponse();
        ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02020-info");
        // 재 조회로 호출되었다면..
        if (req.getCallPurpose().equals("refresh")) {
            DataObject totalInfo = sprt02Service.getCrdnInfo(req);              // 단속(TB_CRDN) 대장 조회
            mav.addObject("totalInfo", json ? totalInfo : toJson(totalInfo));   // 단속 메인 정보
        }

        return mav
            .addObject("pageNameMain", "sprt02010")                         // pageNameMain
            .addObject("pageName", "sprt02020")                             // pageName
            .addObject("crdnPayerInfo", json ? crdnPayerInfo : toJson(crdnPayerInfo))   // 단속, 납부자 정보
        ;
    }

    /**지정하는 단속 ID의 의견제출 정보를 반환한다.
     * @param crdnId 단속ID
     * @return fims/sprt/sprt02030-main 또는 jsonView
     * <pre><code> {
     *     "opnnSbmsn": {...}
     * }</code></pre>
     */
    @Task
    @RequestMapping(name="개별총정보 의견제출 정보 조회", value=METHOD_URL.getOpnnSbmsnInfo)
    public ModelAndView getOpnnSbmsnInfo(SprtQuery req) {
        // 의견 제출(TB_OPNN_SBMSN) 대장 조회
        LevyExclQuery reqLevyExcl =  new LevyExclQuery();
        reqLevyExcl.setCrdnId(req.getCrdnId());
        reqLevyExcl.setDelYn("N");
        DataObject opnnInfo = opnnSbmsnService.getOpnnSbmsnInfo(reqLevyExcl);

        boolean json = jsonResponse();
        ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02030-info");
        // 재 조회로 호출되었다면..
        if (req.getCallPurpose().equals("refresh")) {
            DataObject totalInfo = sprt02Service.getCrdnInfo(req);              // 단속(TB_CRDN) 대장 조회
            mav.addObject("totalInfo", json ? totalInfo : toJson(totalInfo));   // 단속 메인 정보
        }

        return mav
            .addObject("pageNameMain", "sprt02010")                         // pageNameMain
            .addObject("pageName", "sprt02030")                             // pageName
            .addObject("opnnInfo", json ? opnnInfo : toJson(opnnInfo))      // 의견제출 정보
        ;
    }

    /**지정하는 단속 ID의 발송상세 정보를 반환한다.
     * @param crdnId 단속ID
     * @return fims/sprt/sprt02040-main 또는 jsonView
     * <pre><code> {
     *     "sndngDtl": {...}
     * }</code></pre>
     */
    @Task
    @RequestMapping(name="개별총정보 발송, 반송 정보 조회", value=METHOD_URL.getSndngInfo)
    public ModelAndView getSndngInfo(SprtQuery req) {
        // 발송 상세 정보
        SndbQuery sndbQuery = new SndbQuery()
        	.setCrdnId(req.getCrdnId())
        	.setDelYn("N")
        	.setOrderBy("SD.REG_DT, SD.SNDNG_DTL_ID");                     // 정렬
        List<?> sndngDtls = sndngDtlService.getSndngDtls(sndbQuery);            // 발송 상세 정보

        sndbQuery.setOrderBy("SV.REG_DT, SV.SVBTC_ID");                         // 정렬
        List<?> svbtcDtls = svbtcService.getSvbtcDtls(sndbQuery);               // 공시송달 정보

        boolean json = jsonResponse();
        ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02040-info");
        // 재조회로 호출되었다면..
        if (req.getCallPurpose().equals("refresh")) {
            DataObject totalInfo = sprt02Service.getCrdnInfo(req);              // 단속(TB_CRDN) 대장 조회
            mav.addObject("totalInfo", json ? totalInfo : toJson(totalInfo));   // 단속 정보
        }

        return mav
            .addObject("pageNameMain", "sprt02010")                         // pageNameMain
            .addObject("pageName", "sprt02040")                             // pageName
            .addObject("sndngDtls", json ? sndngDtls : toJson(sndngDtls))   // 발송상세 정보
            .addObject("svbtcDtls", json ? svbtcDtls : toJson(svbtcDtls))   // 공시송달 정보
		;
	}

    /**지정하는 단속 ID의 처리상태이력, 감경, 부과제외 정보를 반환한다.
     * @param crdnId 단속ID
     * @return fims/sprt/sprt02050-main 또는 jsonView
     * <pre><code> {
     *     "sndngDtl": {...}
     * }</code></pre>
     */
    @Task
    @RequestMapping(name="개별총정보 처리 상세 정보 조회", value=METHOD_URL.getPrcsDtlInfo)
    public ModelAndView getPrcsDtlInfo(SprtQuery req) {
        // 과태료 감경(TB_RDCT) 대장 조회
        LevyQuery levyQuery = new LevyQuery();
        if (req.getCallPurpose() == null) {
            levyQuery.setCallPurpose("view");
        } else {
            levyQuery.setCallPurpose(req.getCallPurpose());
        }
        levyQuery
        	.setCrdnId(req.getCrdnId())
        	.setDelYn(req.getDelYn())
        	.setOrderBy("RDCT_ID DESC");
        DataObject rdctInfo = rdctService.getRdctInfo(levyQuery);

        // 부과 제외(TB_LEVY_EXCL) 대장 조회
        LevyExclQuery exclQuery = new LevyExclQuery();
        if (req.getCallPurpose() == null) {
            exclQuery.setCallPurpose("view");
        } else {
            exclQuery.setCallPurpose(req.getCallPurpose());
        }
        exclQuery.setCrdnId(req.getCrdnId());                                   // 단속 ID
        exclQuery.setDelYn(req.getDelYn());                                     // 삭제 여부
        exclQuery.setOrderBy("LEVY_EXCL_ID DESC");                              // 정렬
        DataObject levyExclInfo = levyExclService.getLevyExclInfo(exclQuery);

        // 단속 상태 이력(TB_CRDN_STTS_HSTRY) 조회
        CrdnSttsHstryQuery crdnSttsHstryQuery = new CrdnSttsHstryQuery()
        	.setCrdnId(req.getCrdnId());                          // 단속 ID
        // 미사용 조회 여부
        if (!"Y".equals(req.getUnusedInq())) {
            crdnSttsHstryQuery.setUseYn("Y");                                   // 사용 여부
        }
        crdnSttsHstryQuery.setOrderBy("CSH.STTS_HSTRY_ID DESC");
        List<?> crdnSttsHstrys = crdnSttsHstryService.getCrdnSttsHstrys(crdnSttsHstryQuery);

        // 납부자 변경 이력(TB_PAYER_HSTRY) 조회
        PayerQuery payerQuery = new PayerQuery()
        	.setCrdnId(req.getCrdnId())
        	.setOrderBy("CPAH.REG_DT DESC");
        List<?> payerAddrHstrys = payerService.getPayerAddrHstrys(payerQuery);

        boolean json = jsonResponse();
        ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02050-info");
        // 재조회로 호출되었다면..
        if (req.getCallPurpose().equals("refresh")) {
            DataObject totalInfo = sprt02Service.getCrdnInfo(req);              // 단속(TB_CRDN) 대장 조회
            mav.addObject("totalInfo", json ? totalInfo : toJson(totalInfo));   // 단속 정보
        }

        return mav
            .addObject("pageNameMain", "sprt02010")                                         // pageNameMain
            .addObject("pageName", "sprt02050")                                             // pageName
            .addObject("rdctInfo", json ? rdctInfo : toJson(rdctInfo))                      // 과태료 감경 정보
            .addObject("levyExclInfo", json ? levyExclInfo : toJson(levyExclInfo))          // 부과 제외 정보
            .addObject("crdnSttsHstrys", json ? crdnSttsHstrys : toJson(crdnSttsHstrys))    // 단속 상태 이력
            .addObject("payerAddrHstrys", json ? payerAddrHstrys : toJson(payerAddrHstrys)) // 납부자 주소 변경 이력
        ;
    }

    /**지정하는 단속 ID의 부과, 체납 정보를 반환한다.
     * @param crdnId 단속ID
     * @return fims/sprt/sprt02060-main 또는 jsonView
     * <pre><code> {
     *     "sndngDtl": {...}
     * }</code></pre>
     */
    @Task
    @RequestMapping(name="개별총정보 부과, 체납 정보 조회", value=METHOD_URL.getLevyNpmntInfo)
    public ModelAndView getLevyNpmntInfo(SprtQuery req) {
        // 부과(TB_LEVY) 대장 조회
        LevyQuery levyQuery = new LevyQuery();
        if (req.getCallPurpose() == null) {
            levyQuery.setCallPurpose("view");
        } else {
            levyQuery.setCallPurpose(req.getCallPurpose());
        }
        levyQuery
        	.setCrdnId(req.getCrdnId())
        	.setDelYn(req.getDelYn())
        	.setOrderBy("LEVY_ID DESC");
        DataObject levyInfo = levyService.getLevyInfo(levyQuery);

        boolean json = jsonResponse();
        ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02060-info");
        // 재 조회로 호출되었다면..
        if (req.getCallPurpose().equals("refresh")) {
            DataObject totalInfo = sprt02Service.getCrdnInfo(req);              // 단속(TB_CRDN) 대장 조회
            mav.addObject("totalInfo", json ? totalInfo : toJson(totalInfo));   // 단속 정보
        }

        return mav
            .addObject("pageNameMain", "sprt02010")                         // pageNameMain
            .addObject("pageName", "sprt02060")                             // pageName
            .addObject("levyInfo", json ? levyInfo : toJson(levyInfo))      // 부과 정보
        ;
    }

    /**지정하는 단속 ID의 수납 정보를 반환한다.
     * @param crdnId 단속ID
     * @return fims/sprt/sprt02070-main 또는 jsonView
     * <pre><code> {
     *     "rcvmt": {...}
     * }</code></pre>
     */
    @Task
    @RequestMapping(name="개별총정보 수납 정보 조회", value=METHOD_URL.getRcvmtInfo)
    public ModelAndView getRcvmtInfo(SprtQuery req) {
        // 수납(TB_RCVMT) 대장 조회
        RcvmtQuery rcvmtQuery = new RcvmtQuery();
        if (req.getCallPurpose() == null) {
            rcvmtQuery.setCallPurpose("view");
        } else {
            rcvmtQuery.setCallPurpose(req.getCallPurpose());
        }
        rcvmtQuery
        	.setCrdnId(req.getCrdnId())
        	.setDelYn(req.getDelYn())
        	.setOrderBy("R.RCVMT_ID DESC");
        List<DataObject> rcvmts = rcvmtService.getRcvmts(rcvmtQuery);

        boolean json = jsonResponse();
        ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02070-info");
        // 재 조회로 호출되었다면..
        if (req.getCallPurpose().equals("refresh")) {
            DataObject totalInfo = sprt02Service.getCrdnInfo(req);              // 단속(TB_CRDN) 대장 조회
            mav.addObject("totalInfo", json ? totalInfo : toJson(totalInfo));   // 단속 정보
        }

        return mav
            .addObject("pageNameMain", "sprt02010")                         // pageNameMain
            .addObject("pageName", "sprt02070")                             // pageName
            .addObject("rcvmts", json ? rcvmts : toJson(rcvmts))            // 수납 정보
        ;
    }

    /**지정하는 단속 ID의 민원 상담 정보를 반환한다.
     * @param crdnId 단속ID
     * @return fims/sprt/sprt02080-main 또는 jsonView
     * <pre><code> {
     *     "cvlcptDscsnCn": {...}
     * }</code></pre>
     */
    @Task
    @RequestMapping(name="개별총정보 민원 상담 정보 조회", value=METHOD_URL.getCvlcptDscsnInfo)
    public ModelAndView getCvlcptDscsnInfo(SprtQuery req) {
        // 민원 상담(TB_CVLCPT_DSCSN) 대장 조회
        CvlcptDscsnQuery cvlcptDscsnQuery = new CvlcptDscsnQuery();
        if (req.getCallPurpose() == null) {
            cvlcptDscsnQuery.setCallPurpose("view");
        } else {
            cvlcptDscsnQuery.setCallPurpose(req.getCallPurpose());
        }
        cvlcptDscsnQuery
        	.setInquiryCondition(req.getInquiryCondition())
        	.setCrdnId(req.getCrdnId())
        	.setVhrno(req.getVhrno())
        	.setSggCd(req.getSggCd())
        	.setTaskSeCd(req.getTaskSeCd())
        	.setDelYn(req.getDelYn())
        	.setOrderBy("CD.CVLCPT_DSCSN_ID DESC");
        List<DataObject> cvlcptDscsns = cvlcptDscsnService.getCvlcptDscsns(cvlcptDscsnQuery);

        boolean json = jsonResponse();
        ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/sprt/sprt02080-info");
        // 재조회로 호출되었다면..
        if (req.getCallPurpose().equals("refresh")) {
            DataObject totalInfo = sprt02Service.getCrdnInfo(req);              // 단속(TB_CRDN) 대장 조회
            mav.addObject("totalInfo", json ? totalInfo : toJson(totalInfo));   // 단속 정보
        }

        return mav
            .addObject("pageNameMain", "sprt02010")                                 // pageNameMain
            .addObject("pageName", "sprt02080")                                     // pageName
            .addObject("cvlcptDscsns", json ? cvlcptDscsns : toJson(cvlcptDscsns))  // 민원상담내용 정보
	    ;
    }
}