import { useEffect, useState } from 'react';
import { useCommonSearch } from './useCommonSearch';
import useRDSPagination from './useRDSPagination';
import useDynamoDBPagination from './useDynamoDBPagination';

/**
 * 확장된 CommonSearch 훅
 * 설정에 따라 RDS 또는 DynamoDB 페이지네이션을 사용
 *
 * @param {string} configPath 설정 파일 경로
 * @returns {Object} 검색 및 페이지네이션 관련 상태와 메서드
 */
export const useEnhancedCommonSearch = (configPath) => {
	const [paginationType, setPaginationType] = useState(null);

	// 기본 검색 기능
	const commonSearch = useCommonSearch(configPath);
	const {
		config,
		searchParams,
		data,
		loading: searchLoading,
		handleSearch: originalHandleSearch,
		updateSearchParams,
		handleReset: originalHandleReset,
		configLoaded
	} = commonSearch;

	// 설정에서 페이지네이션 타입 가져오기
	useEffect(() => {
		if (config) {
			setPaginationType(config.paginationType || 'rds');
		}
	}, [config]);

	// RDS 페이지네이션
	const rdsPagenation = useRDSPagination(async (pageParams) => {
		return await originalHandleSearch(pageParams, true);
	}, {
		currentPage: searchParams.currentPage,
		pageSize: searchParams.pageSize,
		totalItems: data?.total_all || data?.total || 0,
		totalPages: data?.total_pages || Math.ceil((data?.total_all || data?.total || 0) / searchParams.pageSize)
	});

	// DynamoDB 페이지네이션
	const dynamoDBPagination = useDynamoDBPagination(async (pageParams) => {
		return await originalHandleSearch(pageParams, true);
	}, {
		currentPage: searchParams.currentPage,
		pageKeys: { 1: null },
		hasNextPage: !!(data?.LastEvaluatedKey || data?.lastEvaluatedKey || data?.pageKey),
		items: data?.list || data?.items || [],
		itemCount: (data?.list || data?.items || []).length
	});

	// 현재 페이지네이션 타입에 따른 핸들러
	const paginationHandler = paginationType === 'dynamodb' ? dynamoDBPagination : rdsPagenation;

	// 검색 핸들러 (페이지네이션 리셋 포함)
	const handleSearch = async (newParams = {}, executeSearch = true) => {
		if (!executeSearch) {
			updateSearchParams(newParams);
			return null;
		}

		// 키워드 검색 시 페이지네이션 리셋
		if (paginationType === 'dynamodb') {
			return await dynamoDBPagination.newSearch({
				...searchParams,
				...newParams
			});
		} else {
			updateSearchParams(newParams);
			return await rdsPagenation.goToPage(1);
		}
	};

	// 리셋 핸들러
	const handleReset = async () => {
		await originalHandleReset();
		if (paginationType === 'dynamodb') {
			return await dynamoDBPagination.resetPagination();
		}
		// else {
		// 	await rdsPagenation.resetPagination();
		// }
	};

	return {
		// 기본 검색 상태
		config,
		searchParams,
		data,
		loading: searchLoading || paginationHandler.loading,
		configLoaded,
		updateSearchParams,

		// 페이지네이션 타입 및 상태
		paginationType,
		pagination: paginationHandler.pagination,

		// 통합된 핸들러
		handleSearch,
		handleReset,

		// 페이지네이션 핸들러
		handlePageChange: paginationHandler.goToPage,
		goToNextPage: paginationHandler.goToNextPage,
		goToPrevPage: paginationHandler.goToPrevPage,

		// RDS 전용 핸들러
		handlePageSizeChange: rdsPagenation.changePageSize,
		handleOrderByChange: commonSearch.handleOrderByChange
	};
};

export default useEnhancedCommonSearch;