import React, { createContext, useContext, useEffect, useState } from "react";

import { observer } from "mobx-react-lite";
import { apiStore } from "../api/ApiStore/store";

// Обновленный тип контекста
type GeolocationContextType = {
  contextData: any; // Сохраняем для других данных (например, routeId)
  setContextData: React.Dispatch<React.SetStateAction<any>>;
  nearestSightId: string | null; // Отдельное состояние для nearestSightId
  setNearestSightId: React.Dispatch<React.SetStateAction<string | null>>; // Сеттер для nearestSightId
  isLoading: boolean;
  error: string | null;
  selectedSightId: string | null;
  setSelectedSightId: React.Dispatch<React.SetStateAction<string | null>>;
  selectedLanguage: string;
  setSelectedLanguage: React.Dispatch<React.SetStateAction<string>>;
  selectedLanguageRight: string;
  setSelectedLanguageRight: React.Dispatch<React.SetStateAction<string>>;
  nearestStationId: string | null;
  setNearestStationId: React.Dispatch<React.SetStateAction<string | null>>;
};

const GeolocationContext = createContext<GeolocationContextType>({
  contextData: null,
  setContextData: () => {},
  nearestSightId: null,
  setNearestSightId: () => {},
  isLoading: false,
  error: null,
  selectedSightId: null,
  setSelectedSightId: () => {},
  selectedLanguage: "ru",
  setSelectedLanguage: () => {},
  selectedLanguageRight: "ru",
  setSelectedLanguageRight: () => {},
  nearestStationId: null,
  setNearestStationId: () => {},
});

export const GeolocationProvider = observer(
  ({ children }: { children: React.ReactNode }) => {
    const { context } = apiStore;
    const [contextData, setContextData] = useState<any>(null); // Общее состояние для контекстных данных
    const [nearestSightId, setNearestSightId] = useState<string | null>(null); // Отдельное состояние для nearestSightId
    const [isLoading, setIsLoading] = useState(false);
    const [error, setError] = useState<string | null>(null);
    const [selectedSightId, setSelectedSightId] = useState<string | null>(null);
    const [selectedLanguage, setSelectedLanguage] = useState<string>("ru");
    const [selectedLanguageRight, setSelectedLanguageRight] =
      useState<string>("ru");
    const [nearestStationId, setNearestStationId] = useState<string | null>(
      null
    );

    // Эффект для первоначальной загрузки contextData (выполняется один раз)
    useEffect(() => {
      const fetchInitialContext = async () => {
        setIsLoading(true);
        try {
          setContextData(context);
          setNearestSightId(context?.nearestSightId!); // Инициализируем nearestSightId также
          setNearestStationId(context?.routeProgress?.endStopId || null);
          setError(null);
        } catch (err) {
          setError("Не удалось загрузить геоданные при инициализации");
          console.error("Ошибка при инициализации контекста:", err);
        } finally {
          setIsLoading(false);
        }
      };

      fetchInitialContext();
    }, [context]); // Пустой массив зависимостей: эффект запускается только один раз при монтировании

    return (
      <GeolocationContext.Provider
        value={{
          contextData,
          setContextData,
          nearestSightId,
          setNearestSightId,
          isLoading,
          error,
          selectedSightId,
          setSelectedSightId,
          selectedLanguage,
          setSelectedLanguage,
          selectedLanguageRight,
          setSelectedLanguageRight,
          nearestStationId,
          setNearestStationId,
        }}
      >
        {children}
      </GeolocationContext.Provider>
    );
  }
);

export const useGeolocation = () => useContext(GeolocationContext);
