import { create } from "zustand";
import { createJSONStorage, persist } from "zustand/middleware";
import AsyncStorage from "@react-native-async-storage/async-storage";
import axios from "axios";
import { router } from "expo-router";

const API_URL = "https://hopp.zikor.pl/api/v1";

let interceptorInitialized = false;

export const useAuthStore = create(
  persist(
    (set, get) => {
      // if (!interceptorInitialized.current) {
      //   axios.interceptors.response.use(
      //     (response) => response,
      //     (error) => {
      //       if (
      //         (error.response && error.response.status === 401) ||
      //         error.response.status === 403
      //       ) {
      //         set({ user_id: null, token: null, isLoading: false });
      //         delete axios.defaults.headers.common["Authorization"];
      //       }
      //       return Promise.reject(error);
      //     }
      //   );
      //   interceptorInitialized = true;
      // }
      return {
        user_id: null,
        token: null,
        isLoading: false,
        error: null,

        signIn: async (email, password) => {
          set({ isLoading: true, error: null });
          try {
            const response = await axios.post(`${API_URL}/auth/login`, {
              email,
              password,
            });

            const user_id = response.data.user_id;
            const token = response.data.token;
            set({ user_id: user_id, token: token, isLoading: false });

            axios.defaults.headers.common["Authorization"] = `Bearer ${token}`;
          } catch (error) {
            set({
              error: error.response?.data?.message || error.message,
              isLoading: false,
            });
            throw error;
          }
        },

        signUp: async (userData) => {
          set({ isLoading: true, error: null });
          try {
            const response = await axios.post(
              `${API_URL}/auth/register`,
              userData,
              {
                headers: { "Content-Type": "application/json" },
              }
            );

            const user_id = response.data.user_id;
            const token = response.data.token;
            set({ user_id: user_id, token: token, isLoading: false });

            axios.defaults.headers.common["Authorization"] = `Bearer ${token}`;
          } catch (error) {
            set({
              error: error.response?.data?.message || error.message,
              isLoading: false,
            });
            throw error;
          }
        },

        signInWithGoogle: async (googleToken) => {
          set({ isLoading: true, error: null });
          try {
            const response = await axios.post(
              `${API_URL}/auth/google`,
              { googleToken: googleToken },
              {
                headers: { "Content-Type": "application/json" },
              }
            );
            const user_id = response.data.user_id;
            const token = response.data.token;
            set({ user_id: user_id, token: token, isLoading: false });

            axios.defaults.headers.common["Authorization"] = `Bearer ${token}`;
          } catch (error) {
            set({
              error: error.response?.data?.message || error.message,
              isLoading: false,
            });
            throw error;
          }
        },

        signOut: async () => {
          const { token } = get();
          const headers = token ? { Authorization: `Bearer ${token}` } : {};
          try {
            await axios.post(
              `${API_URL}/auth/logout`,
              {},
              {
                headers: headers,
              }
            );
          } catch (error) {
            console.error("Logout error:", error);
          } finally {
            delete axios.defaults.headers.common["Authorization"];
            set({ user_id: null, token: null });
            router.replace("/login");
          }
        },
      };
    },
    {
      name: "auth-storage",
      storage: createJSONStorage(() => AsyncStorage),
    }
  )
);
