import { useCallback, useState } from 'react';

/**
 * RDS 스타일의 페이지네이션을 위한 훅
 * 페이지 번호와 페이지 크기 기반의 일반적인 페이지네이션 방식
 *
 * @param {Function} fetchFunction 데이터를 가져오는 함수 (페이지 파라미터를 받음)
 * @param {Object} initialState 초기 페이지네이션 상태
 * @returns {Object} 페이지네이션 관련 상태와 메서드
 */
export const useRDSPagination = (fetchFunction, initialState = {}) => {
	// 페이지네이션 상태
	const [pagination, setPagination] = useState({
		currentPage: initialState.currentPage || 1,
		pageSize: initialState.pageSize || 10,
		totalItems: initialState.totalItems || 0,
		totalPages: initialState.totalPages || 0
	});

	// 로딩 상태
	const [loading, setLoading] = useState(false);

	/**
	 * 특정 페이지로 이동
	 * @param {number} page 이동할 페이지 번호
	 * @returns {Promise} 데이터 가져오기 결과
	 */
	const goToPage = useCallback(async (page) => {
		if (page < 1) return null;

		setLoading(true);
		try {
			// 페이지 정보를 포함하여 데이터 가져오기
			const response = await fetchFunction({
				currentPage: page,
				pageSize: pagination.pageSize
			});

			// 페이지네이션 정보 업데이트
			setPagination(prev => ({
				...prev,
				currentPage: page,
				totalItems: response.total_all || response.total || 0,
				totalPages: response.total_pages || Math.ceil((response.total_all || response.total || 0) / pagination.pageSize)
			}));

			return response;
		} catch (error) {
			console.error('페이지 데이터 가져오기 오류:', error);
			throw error;
		} finally {
			setLoading(false);
		}
	}, [fetchFunction, pagination.pageSize]);

	/**
	 * 다음 페이지로 이동
	 * @returns {Promise} 데이터 가져오기 결과
	 */
	const goToNextPage = useCallback(() => {
		if (pagination.currentPage >= pagination.totalPages) return null;
		return goToPage(pagination.currentPage + 1);
	}, [pagination.currentPage, pagination.totalPages, goToPage]);

	/**
	 * 이전 페이지로 이동
	 * @returns {Promise} 데이터 가져오기 결과
	 */
	const goToPrevPage = useCallback(() => {
		if (pagination.currentPage <= 1) return null;
		return goToPage(pagination.currentPage - 1);
	}, [pagination.currentPage, goToPage]);

	/**
	 * 페이지 크기 변경
	 * @param {number} newSize 새 페이지 크기
	 * @returns {Promise} 데이터 가져오기 결과
	 */
	const changePageSize = useCallback(async (newSize) => {
		setLoading(true);
		try {
			const response = await fetchFunction({
				currentPage: 1, // 페이지 크기 변경 시 첫 페이지로 이동
				pageSize: newSize
			});

			// 페이지네이션 정보 업데이트
			setPagination(prev => ({
				...prev,
				currentPage: 1,
				pageSize: newSize,
				totalItems: response.total_all || response.total || 0,
				totalPages: response.total_pages || Math.ceil((response.total_all || response.total || 0) / newSize)
			}));

			return response;
		} catch (error) {
			console.error('페이지 크기 변경 오류:', error);
			throw error;
		} finally {
			setLoading(false);
		}
	}, [fetchFunction]);

	/**
	 * 페이지네이션 리셋
	 * @returns {Promise} 데이터 가져오기 결과
	 */
	const resetPagination = useCallback(async () => {
		return goToPage(1);
	}, [goToPage]);

	return {
		type: 'rds',
		pagination,
		loading,
		goToPage,
		goToNextPage,
		goToPrevPage,
		changePageSize,
		resetPagination,

		// 레거시 호환성을 위한 별칭
		handlePageChange: goToPage,
		handlePageSizeChange: changePageSize
	};
};

export default useRDSPagination;