package kr.xit.biz.mbl.web;

import javax.servlet.http.*;

import org.apache.commons.lang.*;
import org.springframework.http.*;
import org.springframework.stereotype.*;
import org.springframework.ui.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.*;

import io.swagger.v3.oas.annotations.*;
import io.swagger.v3.oas.annotations.tags.*;
import kr.xit.biz.common.*;
import kr.xit.biz.common.ApiConstants.*;
import kr.xit.biz.ens.model.ktgbs.*;
import kr.xit.biz.mbl.model.*;
import kr.xit.biz.mbl.service.*;
import kr.xit.core.exception.*;
import lombok.*;

/**
 * <pre>
 * description : 전자문서 중개자 모바일 페이지 API Controller
 *               - mens-web에서 호출
 * packageName : kr.xit.biz.mbl.web
 * fileName    : MobilePageController
 * author      : limju
 * date        : 2023-08-31
 * ======================================================================
 * 변경일         변경자        변경 내용
 * ----------------------------------------------------------------------
 * 2023-08-31    limju       최초 생성
 *
 * </pre>
 */
@Tag(name = "MobilePageController", description = "전자문서 중개자 모바일 페이지 API Controller")
@RequiredArgsConstructor
@Controller
@RequestMapping(value = "/api/biz/mbl")
public class MobilePageController {
    private final IMobilePageService service;

    /**
     * <pre>
     *  카카오 모바일 페이지 요청
     *  - mens-web에서 호출 : {@code EnsMobileApiClientController.findKkoMyDocReadyAndMblPage}
     *    <a href="http://localhost:8080/api/web/mbl/v1/kko/mblPage.do">kakao mobile page</a>
     * @param reqDTO OneTimeToken
     * @return IApiResponse 모바일 페이지 데이타 String return
     * </pre>
     */
    @Operation(summary = "카카오 모바일 데이타 요청(모바일 페이지에서 호출)", description = "카카오 모바일 데이타 요청(모바일 페이지에서 호출)")
    @GetMapping(
        value = {"/kko/mblPage"})
    public String findKkoReadyAndMblData(@ModelAttribute final MobilePageDTO.KakaoValidTokenRequest reqDTO, Model model) {

        if ((StringUtils.isEmpty(reqDTO.getDocument_binder_uuid()) && StringUtils.isEmpty(reqDTO.getEnvelopeId()))
            || StringUtils.isEmpty(reqDTO.getToken())) {
            throw BizRuntimeException.create("정상적인 요청이 아닙니다. 재인증 후 시도하시기 바랍니다.");
        }

        try {
            if (StringUtils.isNotEmpty(reqDTO.getDocument_binder_uuid())) {
                model.addAttribute("details", service.findKkopayReadyAndMblPage(reqDTO));
            } else {
                model.addAttribute("details", service.findKkotalkReadyAndMblPage(reqDTO));
            }
            model.addAttribute("payButtonLinks", "{}");

        } catch (BizRuntimeException e) {
            model.addAttribute("errCode", e.getErrorCode());
            model.addAttribute("errMsg", e.getMessage());
            model.addAttribute("details", "{}");
        } catch (Exception e) {
            model.addAttribute("errCode", e.getMessage());
            model.addAttribute("errMsg", e.getMessage());
            model.addAttribute("details", "{}");
        }
        return "notiPrnt";
    }

    /**
     * <pre>
     * KT 모바일 페이지 요청
     * /kt/mblPage/old - 기존 모바일 페이지(이전 API 사용 모바일 페이지)
     * /kt/mblPage/canES - 천안 동남 구철
     * /kt/mblPage/canWB - 천안 서북 구청
     * - 본문자 수신 등록 요청(BC-AG-SN-002) API 호출시
     *   -> url(callback)에 등록하여 호출 되게 됨
     *   -> callback url ? token=... 형태로
     * - 토큰인증확인조회요청(BC-AG-SN-008) API call
     * - 토큰열람확인결과 전송(BC-AG-SN-009) API call
     *
     * - mens-web에서 호출 : {@code EnsMobileApiClientController.findKtMblPage}
     *   <a href="http://localhost:8080/api/web/mbl/v1/kt/dpMblPage.do?token=">KT DP mobile page</a>
     * - mens-web에서 호출 : {@code EnsMobileApiClientController.findKtMblPage}
     *   <a href="http://localhost:8080/api/web/mbl/v1/kt/meMblPage.do?token=">KT ME mobile page</a>
     *
     * @param token OTT token
     * @param request HttpServletRequest
     * @return IApiResponse 모바일 페이지 데이타 String return
     * </pre>
     */
    @Operation(summary = "KT 모바일 데이타 요청(모바일 페이지에서 호출)", description = "KT 모바일 데이타 요청(모바일 페이지에서 호출)")
    @RequestMapping(
        value = {"/kt/mblPage/old", "/kt/mblPage/canES", "/kt/mblPage/canWN"},
        method = {RequestMethod.POST, RequestMethod.GET},
        produces = MediaType.APPLICATION_JSON_VALUE)
    public ModelAndView findKtMblPage(@RequestParam final String token, @RequestParam final String src_key,
        final HttpServletRequest request) {
        final String uri = request.getRequestURI();
        String mblCnts = "";

        ModelAndView mav = new ModelAndView();
        mav.setViewName("/notiPrnt");

        try {
            switch (uri) {
                case "/api/biz/mbl/kt/mblPage/canES":
                    mblCnts = service.findKtGbsMblPage(
                        KtGbsDTO.TokenConfirmRequest.builder()
                            .signguCode(SignguCode.CHEONAN_ES.getCode())
                            .ffnlgCode(ApiConstants.FFNLN_CODE)
                            .token(token)
                            .srcKey(src_key)
                            .build()
                    );
                    break;

                case "/api/biz/mbl//kt/mblPage/canWN":
                    mblCnts = service.findKtGbsMblPage(
                        KtGbsDTO.TokenConfirmRequest.builder()
                            .signguCode(SignguCode.CHEONAN_WN.getCode())
                            .ffnlgCode(ApiConstants.FFNLN_CODE)
                            .token(token)
                            .srcKey(src_key)
                            .build()
                    );
                    break;

                case "/api/biz/mbl/kt/mblPage/old":
                    String signguCode = "";
                    if (("CDO01").equals(request.getParameter("service_cd"))) {
                        signguCode = SignguCode.CHEONAN_ES.getCode();
                    } else if (("CSO01").equals(request.getParameter("service_cd"))) {
                        signguCode = SignguCode.CHEONAN_WN.getCode();
                    } else {
                        throw BizRuntimeException.create(
                            String.format("정상적인 요청이 아닙니다. 요청 url을 확인해 주세요.\n(요청 URL: %s)", uri));
                    }

                    mblCnts = service.findKtGbsMblPage(
                        KtGbsDTO.TokenConfirmRequest.builder()
                            .signguCode(signguCode)
                            .ffnlgCode(ApiConstants.FFNLN_CODE)
                            .token(token)
                            .srcKey(src_key)
                            .build()
                    );

                default:
                    throw BizRuntimeException.create(
                        String.format("정상적인 요청이 아닙니다. 요청 url을 확인해 주세요.\n(요청 URL: %s)", uri));
            }
            mav.addObject("details", mblCnts);

        } catch (BizRuntimeException e) {
            mav.addObject("errCode", e.getErrorCode());
            mav.addObject("errMsg", e.getMessage());
        } catch (Exception e) {
            mav.addObject("errCode", e.getMessage());
            mav.addObject("errMsg", e.getMessage());
        }
        return mav;
    }

    @Operation(summary = "모바일 데이타 요청 테스트 페이지", description = "모바일 데이타 요청 테스트 페이지")
    @RequestMapping(
        value = {"/notiPrnt"},
        method = {RequestMethod.POST, RequestMethod.GET})
    public String notiPrntCall(@RequestParam("token") String token,
        @RequestParam("document_binder_uuid") String documentBinderUuid,
        @RequestParam("external_document_uuid") String externalDocumentUuid,
        Model model) {
        
        model.addAttribute("token", token);
        model.addAttribute("document_binder_uuid", documentBinderUuid);
        model.addAttribute("external_document_uuid", externalDocumentUuid);
        return "notiPrntCall";
    }

    @Operation(summary = "모바일 데이타 요청 테스트 페이지", description = "모바일 데이타 요청 테스트 페이지")
    @RequestMapping(
        value = {"/notiPrnt2"},
        method = {RequestMethod.POST, RequestMethod.GET},
        produces = MediaType.TEXT_HTML_VALUE)
    public ModelAndView notiPrntCall2(@RequestParam("token") String token,
        @RequestParam("document_binder_uuid") String documentBinderUuid,
        @RequestParam("external_document_uuid") String externalDocumentUuid) {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("/notiPrntCall");
        mav.addObject("token", token);
        mav.addObject("document_binder_uuid", documentBinderUuid);
        mav.addObject("external_document_uuid", externalDocumentUuid);
        return mav;
    }
}