import { useCallback, useState } from 'react';

/**
 * DynamoDB 스타일의 페이지네이션을 위한 훅
 * LastEvaluatedKey 기반의 페이지네이션 방식
 *
 * @param {Function} fetchFunction 데이터를 가져오는 함수 (페이지와 키 파라미터를 받음)
 * @param {Object} initialState 초기 페이지네이션 상태
 * @returns {Object} 페이지네이션 관련 상태와 메서드
 */
export const useDynamoDBPagination = (fetchFunction, initialState = {}) => {
	// 페이지네이션 상태
	const [pagination, setPagination] = useState({
		currentPage: initialState.currentPage || 1,
		pageKeys: initialState.pageKeys || { 1: null },
		hasNextPage: initialState.hasNextPage || false,
		items: initialState.items || [], // 현재까지 로드된 아이템들
		itemCount: initialState.itemCount || 0 // 현재 페이지 아이템 수
	});

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

	/**
	 * 특정 페이지로 이동
	 * @param {number} page 이동할 페이지 번호
	 * @returns {Promise} 데이터 가져오기 결과
	 */
	const goToPage = useCallback(async (page) => {
		// DynamoDB에서는 임의 페이지로 이동할 수 없음 (pagination.pageKeys에 해당 페이지의 키가 있는 경우만 가능)
		if (page < 1 || (page > pagination.currentPage + 1 && !pagination.pageKeys[page])) {
			console.warn('DynamoDB 페이지네이션에서는 임의 페이지로 이동할 수 없습니다.');
			return null;
		}

		setLoading(true);
		try {
			// 해당 페이지의 시작 키
			const startKey = pagination.pageKeys[page];

			// 데이터 가져오기
			const response = await fetchFunction({
				currentPage: page,
				lastEvaluatedKey: startKey
			});

			// 응답에서 페이지네이션 정보 추출
			const pageKey = response.LastEvaluatedKey || response.lastEvaluatedKey || response.pageKey;
			const items = response.items || response.list || response.data || [];

			// 페이지네이션 정보 업데이트
			setPagination(prev => {
				const updatedPageKeys = { ...prev.pageKeys };

				// 다음 페이지를 위한 키 저장
				if (pageKey) {
					updatedPageKeys[page + 1] = pageKey;
				}

				return {
					...prev,
					currentPage: page,
					pageKeys: updatedPageKeys,
					hasNextPage: !!pageKey,
					items,
					itemCount: items.length
				};
			});

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

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

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

	/**
	 * 페이지네이션 리셋
	 * @returns {Promise} 데이터 가져오기 결과
	 */
	const resetPagination = useCallback(async () => {
		setPagination({
			currentPage: 1,
			pageKeys: { 1: null },
			hasNextPage: false,
			items: [],
			itemCount: 0
		});

		// return goToPage(1);
	}, [goToPage]);

	/**
	 * 새 검색 시작
	 * 키워드가 변경되면 페이지네이션 상태 초기화
	 * @param {Object} searchParams 검색 파라미터
	 * @returns {Promise} 데이터 가져오기 결과
	 */
	const newSearch = useCallback(async (searchParams) => {
		setPagination({
			currentPage: 1,
			pageKeys: { 1: null },
			hasNextPage: false,
			items: [],
			itemCount: 0
		});

		setLoading(true);
		try {
			const response = await fetchFunction({
				...searchParams,
				currentPage: 1,
				lastEvaluatedKey: null
			});

			if (!response) {
				return null;
			}

			// 응답에서 페이지네이션 정보 추출
			const pageKey = response.lastEvaluatedKey || response.pageKey;
			const items = response.items || response.list || response.data || [];

			setPagination({
				currentPage: 1,
				pageKeys: {
					1: null,
					...(pageKey ? { 2: pageKey } : {})
				},
				hasNextPage: !!pageKey,
				items,
				itemCount: items.length
			});

			return response;
		} catch (error) {
			console.error('새 검색 오류:', error);
			throw error;
		} finally {
			setLoading(false);
		}
	}, [fetchFunction]);

	return {
		type: 'dynamodb',
		pagination,
		loading,
		goToPage,
		goToNextPage,
		goToPrevPage,
		resetPagination,
		newSearch,

		// 레거시 호환성을 위한 별칭
		// (DynamoDB는 임의 페이지 이동을 지원하지 않지만, 호환성을 위해 제공)
		handlePageChange: (page) => {
			console.warn('DynamoDB 페이지네이션에서 handlePageChange는 제한적으로 동작합니다');
			if (page === pagination.currentPage + 1) {
				return goToNextPage();
			} else if (page === pagination.currentPage - 1) {
				return goToPrevPage();
			} else if (page === 1) {
				return resetPagination();
			}
			return null;
		}
	};
};

export default useDynamoDBPagination;