package kr.xit.ens.kakao.talk.web;

import java.security.*;

import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;

import io.swagger.v3.oas.annotations.*;
import io.swagger.v3.oas.annotations.media.*;
import io.swagger.v3.oas.annotations.tags.*;
import kr.xit.biz.ens.model.kakao.talk.*;
import kr.xit.core.model.*;
import kr.xit.ens.kakao.talk.service.*;
import lombok.*;
import lombok.extern.slf4j.*;

/**
 * <pre>
 * description : 카카오톡 전자문서 API dummy 테스트 controller
 * packageName : kr.xit.ens.kakao.talk.controller
 * fileName    : KkopayApiDummyTestController
 * author      : julim
 * date        : 2024-12-17
 * ======================================================================
 * 변경일         변경자        변경 내용
 * ----------------------------------------------------------------------
 * 2024-12-17    julim       최초 생성
 *
 * </pre>
 */
@Tag(name = "KkotalkApiDummyTestController", description = "카카오톡 전자문서 API dummy 테스트")
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/kakao/talk/test")
public class KkotalkApiDummyTestController {

    private final KkotalkApiDummyTestService service;

    @Operation(summary = "문서발송 요청", description = "카카오톡 전자문서 서버로 문서발송 처리를 요청")
    @PostMapping(value = "/documents", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponseDTO<?> requestSend(
        @RequestBody final KkotalkDTO.SendRequest reqDTO
    ) {
        return ApiResponseDTO.success(service.requestSend(reqDTO));
    }

    @Operation(summary = "토큰 유효성 검증", description = "Redirect URL 접속 허용/불허")
    @PostMapping(value = "/validToken", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponseDTO<?> validToken(
        @RequestBody final KkotalkApiDTO.ValidTokenRequest reqDTO
    ) {
        return ApiResponseDTO.success(service.validToken(reqDTO));
    }

    /**
     * <pre>
     * 문서 상태 조회 API
     * -.이용기관 서버에서 카카오페이 전자문서 서버로 문서 상태에 대한 조회를 요청 합니다.
     * : 발송된 문서의 진행상태를 알고 싶은 경우, flow와 상관없이 요청 가능
     * : polling 방식으로 호출할 경우, 호출 간격은 5초를 권장.
     * -.doc_box_status 상태변경순서
     * : SENT(송신) > RECEIVED(수신) > READ(열람)/EXPIRED(미열람자료의 기한만료)
     * </pre>
     * @param reqDTO KkopayDocAttrDTO.DocumentBinderUuid
     * @return ApiResponseDTO
     */
    @Operation(summary = "문서 상태 조회", description = "문서 상태 조회")
    @PostMapping(value = "/findStatus", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponseDTO<?> findStatus(
        @RequestBody final KkotalkApiDTO.EnvelopeId reqDTO
    ) {

        SecureRandom random = new SecureRandom(); // Compliant for security-sensitive use cases
        int bound = 1000000000;

        return ApiResponseDTO.success(KkotalkApiDTO.EnvelopeStatusResponse
            .builder()
            .payload(reqDTO.getEnvelopeId())
            //.doc_box_status(ApiConstants.KkopayDocStatus.SENT)
            //.doc_box_sent_at((long)(random.nextInt(bound)) + 1000000000)
            //.doc_box_received_at((long)(random.nextInt(bound)) + 1000000000)
            //.payload("payload 파라미터 입니다.")
            .build());
    }

    /**
     * <pre>
     * 모바일웹 연계 문서발송 요청
     * -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
     * </pre>
     * @param reqDTO KkotalkDTO.BulkSendRequest
     * @return ApiResponseDTO
     */
    @Operation(summary = "대량 문서 발송 요청", description = "카카오톡 전자문서 서버로 대량 문서 발송 요청")
    @PostMapping(value = "/documents/bulk", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponseDTO<?> requestSendBulk(
        @RequestBody final KkotalkDTO.BulkSendRequest reqDTO
    ) {
        return ApiResponseDTO.success(service.requestSendBulk(reqDTO));
    }

    @Operation(summary = "대량 문서 발송 요청", description = "카카오톡 전자문서 서버로 대량 문서 발송 요청 에러")
    @PostMapping(value = "/documents/bulk/error", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponseDTO<?> requestSendBulkError(
        @RequestBody final KkotalkDTO.BulkSendRequest reqDTO
    ) {
        return service.requestSendBulkError(reqDTO);
    }
    
    /**
     * <pre>
     * 모바일웹 연계 문서발송 요청
     * -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
     * </pre>
     * @param reqDTO KkotalkDTO.BulkStatusRequest
     * @return ApiResponseDTO
     */
    @Operation(summary = "대량 문서 상태 조회 요청", description = "카카오톡 전자문서 서버로 대량 문서 상태 조회 요청")
    @io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
        @Content(mediaType = "application/json", examples = {
            @ExampleObject(name = "Example"
                , summary = "부과정보 전송", description = "개별시스템 -> 세외수입 시스템 호출하여 응답 Response"
                , value = "{\"envelopes\":[\"BIN-ff806328863311ebb61432ac599d6151\",\"BIN-ff806328863311ebb61432ac599d6152\",\"BIN-ff806328863311ebb61432ac599d6153\"]}")
        })
    })
    @PostMapping(value = "/documents/bulk/status", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponseDTO<?> findBulkStatus(
        @RequestBody final KkotalkDTO.BulkStatusRequest reqDTO
    ) {
        return ApiResponseDTO.success(service.findBulkStatus(reqDTO));
    }
}
