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

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

export const useAuthStore = create(
  persist(
    (set) => ({
      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 () => {
        try {
          await axios.post(`${API_URL}/auth/logout`);
        } catch (error) {
          console.error("Logout error:", error);
        } finally {
          delete axios.defaults.headers.common["Authorization"];
          set({ user_id: null, token: null });
        }
      },

      checkAuth: async () => {
        const { token } = useAuthStore.getState();
        if (!token) return null;

        set({ isLoading: true });
        try {
          axios.defaults.headers.common["Authorization"] = `Bearer ${token}`;

          const response = await axios.get(`${API_URL}/auth/me`);

          set({ user_id: response.data, isLoading: false });
          return response.data;
        } catch (error) {
          delete axios.defaults.headers.common["Authorization"];
          set({ user_id: null, token: null, isLoading: false });
          return null;
        }
      },
    }),
    {
      name: "auth-storage",
      storage: createJSONStorage(() => AsyncStorage),
    }
  )
);
