import { useState, useEffect, useCallback } from 'react';

const CACHE_EXPIRY = 5 * 60 * 1000; // 5 минут

const cache = new Map();

export const useCache = (key, fetchFn, options = {}) => {
  const {
    expiry = CACHE_EXPIRY,
    dependencies = [],
    skipCache = false
  } = options;

  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  const fetchData = useCallback(async () => {
    try {
      setLoading(true);
      setError(null);

      // Проверяем кэш
      if (!skipCache && cache.has(key)) {
        const cachedData = cache.get(key);
        if (Date.now() - cachedData.timestamp < expiry) {
          setData(cachedData.data);
          setLoading(false);
          return;
        }
      }

      // Если нет в кэше или кэш устарел, делаем запрос
      const result = await fetchFn();
      
      // Сохраняем в кэш
      if (!skipCache) {
        cache.set(key, {
          data: result,
          timestamp: Date.now()
        });
      }

      setData(result);
    } catch (err) {
      setError(err);
      console.error('Cache Error:', err);
    } finally {
      setLoading(false);
    }
  }, [key, fetchFn, expiry, skipCache, ...dependencies]);

  // Очистка устаревших данных из кэша
  useEffect(() => {
    const cleanup = () => {
      const now = Date.now();
      for (const [cacheKey, value] of cache.entries()) {
        if (now - value.timestamp > expiry) {
          cache.delete(cacheKey);
        }
      }
    };

    const interval = setInterval(cleanup, expiry);
    return () => clearInterval(interval);
  }, [expiry]);

  // Очистка конкретного ключа из кэша
  const clearCache = useCallback((cacheKey = key) => {
    cache.delete(cacheKey);
  }, [key]);

  // Очистка всего кэша
  const clearAllCache = useCallback(() => {
    cache.clear();
  }, []);

  return {
    data,
    loading,
    error,
    refetch: fetchData,
    clearCache,
    clearAllCache
  };
}; 