package kr.xit.biz.ens.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.tags.Tag;
import kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO;
import kr.xit.biz.ens.model.kakao.pay.KkopayDocBulkDTO;
import kr.xit.biz.ens.model.kakao.pay.KkopayDocDTO;
import kr.xit.core.model.ApiResponseDTO;
import kr.xit.core.model.IApiResponse;
import kr.xit.core.spring.util.ApiWebClientUtil;
import kr.xit.core.support.utils.JsonUtils;
import lombok.RequiredArgsConstructor;

/**
 * <pre>
 * description :
 *
 * packageName : kr.xit.biz.ens.web
 * fileName    : SendMessageLinkController
 * author      : limju
 * date        : 2023-08-31
 * ======================================================================
 * 변경일         변경자        변경 내용
 * ----------------------------------------------------------------------
 * 2023-08-31    limju       최초 생성
 *
 * </pre>
 */
@Tag(name = "ApiCallTestController", description = "전자고지 통합발송 연계 서비스(배치) 테스트")
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/batch/ens/test/v1")
public class ApiCallTestController {
    @Value("${app.contract.host}")
    private String apiHost;
    @Value("${app.contract.kakao.api.pay.bulksend}")
    private String apiBulkSend;
    @Value("${app.contract.kakao.api.pay.bulkstatus}")
    private String apiBulkStatus;

    private final ApiWebClientUtil apiWebClient;
    private static final String SNDNG_PROCESS_STTUS = "sndngProcessSttus";

    /**
     * <pre>
     * 모바일웹 연계 문서발송 요청
     * -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
     * </pre>
     * @param reqDTO
     * @return ResponseEntity
     */
    @io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
        @Content(mediaType = "application/json", examples = {
            @ExampleObject(value = """
                {
                  "document": {
                    "title": "문서 제목",
                    "read_expired_sec": 3600,
                    "hash": "6EFE827AC88914DE471C621AE",
                    "common_categories": [
                      "NOTICE"
                    ],
                    "receiver": {
                      "phone_number": "01093414345",
                      "name": "김지호",
                      "birthday": "19831218",
                      "is_required_verify_name": false
                    },
                    "property": {
                      "link": "http://ip:18090/api/ens/kakao/v1/ott",
                      "cs_number": "02-123-4567",
                      "cs_name": "콜센터",
                      "payload": "payload 파라미터 입니다.",
                      "message": "해당 안내문은 다음과 같습니다."
                    }
                  }
                }
            """)
        })
    })
    @Operation(summary = "문서발송 요청", description = "카카오페이 전자문서 서버로 문서발송 처리를 요청")
    @PostMapping(value = "/documents", produces = MediaType.APPLICATION_JSON_VALUE)
    public IApiResponse requestSend(
        @RequestBody final KkopayDocDTO.SendRequest reqDTO
    ) {
        StringBuilder url = new StringBuilder()
            .append("http://localhost:18090")
            .append("/api/ens/kakao/v1/documents");

        return apiWebClient.exchangeKkopay(
            url.toString(),
            HttpMethod.POST,
            JsonUtils.toJson(reqDTO),
            ApiResponseDTO.class,
            getRlaybsnmDTO()
        );
    }


    /**
     * <pre>
     * 모바일웹 연계 문서발송 요청
     * -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
     * </pre>
     * @param reqDTO KkopayDocBulkDTO.BulkSendRequests
     * @return ApiResponseDTO
     */
    @Operation(summary = "대량 문서발송 요청", description = "카카오페이 전자문서 서버로 대량 문서발송 처리를 요청")
    @io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
        @Content(mediaType = "application/json", examples = {
            @ExampleObject(value = """
                {
                   "documents": [
                     {
                       "title": "문서 제목",
                       "read_expired_sec": 3600,
                       "hash": "6EFE827AC88914DE471C621AE",
                       "common_categories": [
                         "NOTICE"
                       ],
                       "receiver": {
                         "phone_number": "01093414345",
                         "name": "김지호",
                         "birthday": "19831218",
                         "is_required_verify_name": false
                       },
                       "property": {
                         "link": "http://ip:18090/api/ens/kakao/v1/ott",
                         "cs_number": "02-123-4567",
                         "cs_name": "콜센터",
                         "payload": "payload 파라미터 입니다.",
                         "message": "해당 안내문은 다음과 같습니다.",
                         "external_document_uuid": "A000001"
                       }
                     }
                   ]
                }
            """)
        })
    })
    @PostMapping(value = "/documents/bulk", produces = MediaType.APPLICATION_JSON_VALUE)
    public IApiResponse requestSendBulk(
        @RequestBody final KkopayDocBulkDTO.BulkSendRequests reqDTO
    ) {
        final String url = apiHost + apiBulkSend;

        return apiWebClient.exchangeKkopay(
            url,
            HttpMethod.POST,
            JsonUtils.toJson(reqDTO),
            ApiResponseDTO.class,
            getRlaybsnmDTO()
        );
    }


    /**
     * <pre>
     * 모바일웹 연계 문서발송 요청
     * -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
     * </pre>
     * @param reqDTO KkopayDocBulkDTO.BulkStatusRequests
     * @return ApiResponseDTO<BulkStatusResponses.BulkStatusResponses>
     */
    @io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
        @Content(mediaType = "application/json", examples = {
            @ExampleObject(value = """
                {
                  "document_binder_uuids": [
                    "BIN-883246dbff7b11edb3bb7affed8a016d"
                  ]
                }
            """)
        })
    })
    @Operation(summary = "대량 문서 상태 조회 요청", description = "카카오페이 전자문서 서버로 대량 문서 상태 조회 요청")
    @PostMapping(value = "/documents/bulk/status", produces = MediaType.APPLICATION_JSON_VALUE)
    public IApiResponse findBulkStatus(
        @RequestBody final KkopayDocBulkDTO.BulkStatusRequests reqDTO
    ) {
        final String url = apiHost + apiBulkStatus;

        return apiWebClient.exchangeKkopay(
            url,
            HttpMethod.POST,
            JsonUtils.toJson(reqDTO),
            ApiResponseDTO.class,
            getRlaybsnmDTO()
        );
    }

    private CmmEnsRlaybsnmDTO getRlaybsnmDTO(){
        return CmmEnsRlaybsnmDTO.builder()
                .kakaoClientId("")
                .kakaoContractUuid("")
                .build();
    }
}
