package egovframework.util;

import go.kr.project.common.model.PagingVO;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

import java.util.HashMap;
import java.util.Map;

/**
 * packageName    : egovframework.common.util
 * fileName       : ApiResponseUtil
 * author         : 박성영
 * date           : 25. 5. 8.
 * description    : AJAX 요청에 대한 공통 응답 객체 생성 유틸리티
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 25. 5. 8.        박성영       최초 생성
 */
public class ApiResponseUtil {

    /**
     * 성공 응답 생성 (데이터 없음)
     * @param message 응답 메시지
     * @return ResponseEntity 객체
     */
    public static ResponseEntity<ApiResponseEntity<Void>> success(String message) {
        ApiResponseEntity<Void> response = ApiResponseEntity.<Void>builder()
                .success(true)
                .result(true)
                .message(message)
                .build();
        return ResponseEntity.ok(response);
    }

    /**
     * 성공 응답 생성 (단일 객체)
     * @param data 응답 데이터
     * @param message 응답 메시지
     * @param <T> 데이터 타입
     * @return ResponseEntity 객체
     */
    public static <T> ResponseEntity<ApiResponseEntity<T>> success(T data, String message) {
        ApiResponseEntity<T> response = ApiResponseEntity.<T>builder()
                .success(true)
                .result(true)
                .message(message)
                .data(data)
                .build();
        return ResponseEntity.ok(response);
    }

    /**
     * 성공 응답 생성 (단일 객체, 기본 메시지)
     * @param data 응답 데이터
     * @param <T> 데이터 타입
     * @return ResponseEntity 객체
     */
    public static <T> ResponseEntity<ApiResponseEntity<T>> success(T data) {
        return success(data, "요청이 성공적으로 처리되었습니다.");
    }


    /**
     * 페이징 정보를 포함한 성공 응답 생성
     * TOAST UI Grid 응답 형식에 맞게 구성
     * 
     * TOAST UI Grid는 다음과 같은 응답 형식을 기대합니다:
     * {
     *   data: {
     *     contents: [...], // 실제 데이터 배열
     *     pagination: {
     *       page: number,
     *       perPage: number,
     *       totalCount: number
     *     }
     *   }
     * }
     * 
     * @param data 응답 데이터 리스트
     * @param pagingVO 페이징 정보 객체
     * @param message 응답 메시지
     * @param <T> 데이터 타입
     * @return ResponseEntity 객체
     */
    public static <T> ResponseEntity<ApiResponseEntity<Map<String, Object>>> successWithGrid(T data, PagingVO pagingVO, String message) {
        // TOAST UI Grid 형식에 맞는 데이터 구조 생성
        Map<String, Object> gridData = new HashMap<>();

        // contents에 실제 데이터 배열 설정
        gridData.put("contents", data);

        // pagination 정보 설정
        if( "Y".equals(pagingVO.getPagingYn()) ){
            Map<String, Object> paginationMap = new HashMap<>();
            paginationMap.put("page", pagingVO.getPage());
            paginationMap.put("perPage", pagingVO.getPerPage());
            paginationMap.put("totalCount", pagingVO.getTotalCount());
            paginationMap.put("totalPages", pagingVO.getTotalPages());

            gridData.put("pagination", paginationMap);
        }

        // 응답 객체 생성
        ApiResponseEntity<Map<String, Object>> response = ApiResponseEntity.<Map<String, Object>>builder()
                .success(true)
                .result(true)
                .message(message)
                .data(gridData)
                .build();

        return ResponseEntity.ok(response);
    }

    /**
     * 페이징 정보를 포함한 성공 응답 생성 (기본 메시지)
     * @param data 응답 데이터 리스트
     * @param pagingVO 페이징 정보 객체
     * @param <T> 데이터 타입
     * @return ResponseEntity 객체
     */
    public static <T> ResponseEntity<ApiResponseEntity<Map<String, Object>>> successWithGrid(T data, PagingVO pagingVO) {
        return successWithGrid(data, pagingVO, "요청이 성공적으로 처리되었습니다.");
    }

    /**
     * 실패 응답 생성
     * @param message 에러 메시지
     * @param errorCode 에러 코드
     * @param status HTTP 상태 코드
     * @return ResponseEntity 객체
     */
    public static ResponseEntity<ApiResponseEntity<Void>> error(String message, String errorCode, HttpStatus status) {
        ApiResponseEntity<Void> response = ApiResponseEntity.<Void>builder()
                .success(false)
                .result(false)
                .message(message)
                .errorCode(errorCode)
                .build();
        return ResponseEntity.status(status).body(response);
    }

    /**
     * 실패 응답 생성 (기본 HTTP 상태: BAD_REQUEST)
     * @param message 에러 메시지
     * @param errorCode 에러 코드
     * @return ResponseEntity 객체
     */
    public static ResponseEntity<ApiResponseEntity<Void>> error(String message, String errorCode) {
        return error(message, errorCode, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    /**
     * 실패 응답 생성 (기본 에러 코드: "UNKNOWN_ERROR")
     * @param message 에러 메시지
     * @param status HTTP 상태 코드
     * @return ResponseEntity 객체
     */
    public static ResponseEntity<ApiResponseEntity<Void>> error(String message, HttpStatus status) {
        return error(message, "UNKNOWN_ERROR", status);
    }

    /**
     * 실패 응답 생성 (기본 HTTP 상태: BAD_REQUEST, 기본 에러 코드: "UNKNOWN_ERROR")
     * @param message 에러 메시지
     * @return ResponseEntity 객체
     */
    public static ResponseEntity<ApiResponseEntity<Void>> error(String message) {
        return error(message, "MESSAGE", HttpStatus.INTERNAL_SERVER_ERROR);
    }

}
