package incheon.com.cmm.web;

import incheon.com.cmm.DefaultPaginationRenderer;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
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;

/**
 * CSR용 페이지네이션 공통 컨트롤러
 *
 * AJAX 요청으로 페이지네이션 HTML을 동적으로 생성하여 반환합니다.
 * DefaultPaginationRenderer를 사용하여 SSR과 동일한 HTML 출력을 보장합니다.
 *
 * @author 개발팀
 * @since 2025.10.29
 * @version 1.0
 */
@Slf4j
@RestController
@RequestMapping("/com/pagination")
public class PaginationController {

    /**
     * CSR용 페이지네이션 HTML 렌더링 API
     *
     * JavaScript에서 ICAPP.renderPagination() 호출 시 사용됩니다.
     *
     * @param request - PaginationInfo와 동일한 구조의 요청 DTO
     * @return 페이지네이션 HTML (text/html)
     *
     * @example
     * // JavaScript 사용 예시
     * ICAPP.renderPagination('.pagination-container', {
     *     currentPageNo: 3,
     *     totalRecordCount: 100,
     *     pageSize: 10,
     *     recordCountPerPage: 10
     * }, 'fnSearch');
     */
    @PostMapping(value = "/render.do", produces = "text/html;charset=UTF-8")
    public String renderPagination(@RequestBody PaginationRenderRequest request) {

        log.debug("페이지네이션 렌더링 요청: currentPageNo={}, totalRecordCount={}, jsFunction={}",
                  request.getCurrentPageNo(), request.getTotalRecordCount(), request.getJsFunction());

        // PaginationInfo 객체 생성 (전자정부 표준프레임워크)
        PaginationInfo paginationInfo = new PaginationInfo();
        paginationInfo.setCurrentPageNo(request.getCurrentPageNo());
        paginationInfo.setTotalRecordCount(request.getTotalRecordCount());
        paginationInfo.setPageSize(request.getPageSize());
        paginationInfo.setRecordCountPerPage(request.getRecordCountPerPage());

        // DefaultPaginationRenderer 사용하여 HTML 생성
        DefaultPaginationRenderer renderer = new DefaultPaginationRenderer();
        renderer.initVariables();

        String html = renderer.renderPagination(paginationInfo, request.getJsFunction());

        log.debug("페이지네이션 HTML 생성 완료: totalPageCount={}", paginationInfo.getTotalPageCount());

        return html;
    }

    /**
     * CSR용 페이지네이션 렌더링 요청 DTO
     *
     * PaginationInfo와 동일한 구조를 유지하여 일관성을 보장합니다.
     */
    @Getter
    @Setter
    public static class PaginationRenderRequest {

        /** 현재 페이지 번호 (1부터 시작) */
        private int currentPageNo = 1;

        /** 전체 레코드 수 */
        private int totalRecordCount = 0;

        /** 페이지 블록 크기 (한 번에 표시할 페이지 번호 개수, 기본값: 10) */
        private int pageSize = 10;

        /** 페이지당 레코드 수 (기본값: 10) */
        private int recordCountPerPage = 10;

        /** JavaScript 함수명 (페이지 클릭 시 호출될 함수) */
        private String jsFunction = "fnSearch";
    }
}
