package kr.xit.biz.mbl.web;

import java.util.*;

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

import io.swagger.v3.oas.annotations.*;
import io.swagger.v3.oas.annotations.tags.*;
import kr.xit.biz.ens.model.ktgbs.*;
import kr.xit.biz.mbl.model.*;
import kr.xit.biz.mbl.service.*;
import kr.xit.core.consts.*;
import kr.xit.core.exception.*;
import kr.xit.core.support.utils.*;
import lombok.*;
import lombok.extern.slf4j.*;

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

    /**
     * <pre>
     *  모바일 페이지 요청
     *  - web에서 호출 : JSP page
     * @param map
     * @return 모바일 페이지 데이타 String return
     * </pre>
     */
    @Operation(summary = "모바일 데이타 요청(모바일 페이지에서 호출)", description = "모바일 데이타 요청(모바일 페이지에서 호출)")
    @GetMapping(
        value = {"/goji/intgrn/noti/page/prnt"})
    public String mobilePage(@RequestParam Map<String,String> map, Model model) {
        final String documentBinderUuid = map.get("document_binder_uuid");
        final String envelopeId = map.get("envelopeId");
        final String srcKey = map.get("src_key");
        final String token = map.get("token");

        
        try {
            if (StringUtils.isEmpty(documentBinderUuid) && StringUtils.isEmpty(envelopeId) && StringUtils.isEmpty(srcKey)) {
                throw BizRuntimeException.create("정상적인 요청이 아닙니다. 재인증 후 시도하시기 바랍니다.");
            }

            if (!StringUtils.isEmpty(documentBinderUuid) || !StringUtils.isEmpty(envelopeId)) {
                findKkoReadyAndMblData(
                    MobilePageDTO.KakaoValidTokenRequest.builder()
                        .document_binder_uuid(documentBinderUuid)
                        .envelopeId(envelopeId)
                        .external_document_uuid(map.get("external_document_uuid"))
                        .externalId(map.get("externalId"))
                        .token(token)
                        .build(),
                    model
                );
                
            }else{
                findKtMblPage(token, srcKey, model);
            }

        } catch (BizRuntimeException e) {
            ErrorCode errorCode = e.getErrorCode();
            String errCode = errorCode != null? errorCode.getHttpStatus().value() + "": ErrorCode.BAD_REQUEST.getHttpStatus().value() + "";
            model.addAttribute("errCode", errCode);
            model.addAttribute("errMsg", e.getMessage());
        } catch (Exception e) {
            model.addAttribute("errCode", "500");
            model.addAttribute("errMsg", e.getMessage());
        }
        return "notiPrntCan";
    }
    
    private void findKkoReadyAndMblData(final MobilePageDTO.KakaoValidTokenRequest reqDTO, Model model) {

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

        String mblPage = "";
        try {
            if (StringUtils.isNotEmpty(reqDTO.getDocument_binder_uuid())) {
                mblPage = service.findKkopayReadyAndMblPage(reqDTO);
            } else {
                mblPage = service.findKkotalkReadyAndMblPage(reqDTO);
            }
            
            if(!JsonUtils.isJson(mblPage)){
                log.error("모바일 페이지 에러 :: {}", mblPage);
                throw BizRuntimeException.create("서버 에러 입니다(모바일 페이지 조회)");
            }
            model.addAttribute("details", mblPage);
            model.addAttribute("payButtonLinks", "{}");

        } catch (BizRuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw e;
        }
    }
    
    public void findKtMblPage(final String token, final String srcKey, Model model) {
        try {
            final List<MobilePageDTO.MobilePageManage> sigunguList = service.findKtGbsSignguCode(srcKey);
            if(sigunguList.size() != 1) {
                throw BizRuntimeException.create(
                    String.format("정상적인 요청이 아닙니다. src_key를 확인해 주세요.(요청 src_key: %s)", srcKey));
            }
            
/*
                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()
                    );
*/
            final String mblPage = service.findKtGbsMblPage(
                KtGbsDTO.TokenConfirmRequest.builder()
                    .signguCode(sigunguList.get(0).getSignguCode())
                    .ffnlgCode(sigunguList.get(0).getFfnlgCode())
                    .token(token)
                    .srcKey(srcKey)
                    .build()
            );
                
            if(!JsonUtils.isJson(mblPage)){
                log.error("모바일 페이지 에러 :: {}", mblPage);
                throw BizRuntimeException.create("서버 에러 입니다(모바일 페이지 조회)");
            }
            model.addAttribute("details", mblPage);
            
            model.addAttribute("details",mblPage);

        } catch (BizRuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw e;
        }
    }
}