// stores/authStore.ts
import { defineStore } from "pinia";
import { useStorage } from "@vueuse/core";

export const useAuthStore = defineStore("authStore", () => {
  // ===== state =====
  const user = ref({});
  const isAuthenticated = ref(false);
  const isRealUser = ref(false);
  const errors = ref(null);

  // ===== actions =====
function setUser(response: any) {
  const payload = response?.data ?? {}; // data اصلی از API

  // userData از payload.user_data و user_id ساخته میشه
  const userData = {
    id: payload.user_id ?? null,
    level: payload.user_level ?? null,
    token: payload.token ?? null,
    expire: payload.expire ?? null,
    refresh_token: payload.refresh_token ?? null,
    ...payload.user_data, // first_name, last_name, avatar, username
  };

  isAuthenticated.value = true;
  isRealUser.value = true;
  user.value = userData;
  errors.value = null;

  // ذخیره توکن در localStorage — امن بنویس (هرگز null ننویس)
  try {
    const id_token = useStorage("id_token", "");
    id_token.value = userData.token ?? "";
  } catch (e) {
    console.warn("Could not write id_token to storage:", e);
  }

  // ذخیره کامل user — مطمئن شو شیء است
  try {
    const userStorage = useStorage("user", {});
    userStorage.value = userData ?? {};
  } catch (e) {
    console.warn("Could not write user to storage:", e);
  }

  // ذخیره user_id جداگانه برای دسترسی سریع
  try {
    const userIdStorage = useStorage("user_id", "");
    userIdStorage.value = String(userData.id ?? "");
  } catch (e) {
    console.warn("Could not write user_id to storage:", e);
  }

  // --- محافظت از سایر storage هایی که ممکنه در برنامه استفاده شده باشند ---
  // مثال: اگر یه key برای UI مثل 'sidebar' انتظار فیلد collapsed داره،
  // اطمینان بده که مقدار آن null نیست:
  try {
    const maybeSidebar = useStorage("sidebar", { collapsed: false });
    if (maybeSidebar.value == null) {
      // اگر در localStorage قبلاً null ذخیره شده بود، مقدار پیش‌فرض را بازنویسی کن
      maybeSidebar.value = { collapsed: false };
    }
  } catch (e) {
    // اگر کلیدهای دیگری داری که انتظار فیلد collapsed دارند، مشابهشان را اضافه کن
  }
}


  async function getCaptcha() {
    try {
      const nuxtApp = useNuxtApp();
      const baseUrl = import.meta.env.VITE_AUTH_BASE_URL;
      const { $http: httpService } = nuxtApp;

      const data: string = await httpService.getRequest("/auth/captcha", {
        baseURL: baseUrl,
      });

      return data;
    } catch (error) {
      console.error("Captcha Error:", error);
      return null;
    }
  }

  async function register(credentials: any) {
    try {
      const nuxtApp = useNuxtApp();
      const baseUrl = import.meta.env.VITE_AUTH_BASE_URL;
      const { $http: httpService } = nuxtApp;

      const response = await httpService.postRequest(
        "/auth/register",
        credentials,
        {
          baseURL: baseUrl,
        },
      );

      setUser(response.data);
      return response;
    } catch (error: any) {
      errors.value = error?.response?.data?.message || error.message;
      return error;
    }
  }
  function userReset() {
    user.value = {};
    isAuthenticated.value = false;
    isRealUser.value = false;
    errors.value = null;

    // پاک کردن localStorage / sessionStorage
    const id_token = useStorage("id_token", "");
    id_token.value = "";

    const userStorage = useStorage("user", {});
    userStorage.value = {};
  }
  return {
    // state
    user,
    isAuthenticated,
    isRealUser,
    errors,

    // actions
    setUser,
    getCaptcha,
    register,
    userReset,
  };
});
