import { OrdersStatus } from "@/app/profile/orders/types/Types";
import { TOKEN_NAME, REFRESH_TOKEN_NAME } from "./const";

export function isEmail(input: string): boolean {
  const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  return emailRegex.test(input);
}

export function NumberFormat(number: number): string {
  return Intl.NumberFormat("fa-IR").format(number);
  // return Intl.NumberFormat("fa-IR").format(number);
}

export const timeAgo = (date: string | Date): string => {
  const now = new Date();
  const past = new Date(date);
  const diff = Math.floor((now.getTime() - past.getTime()) / 1000); // اختلاف بر حسب ثانیه

  const units = [
    { name: "سال", value: 60 * 60 * 24 * 365 },
    { name: "ماه", value: 60 * 60 * 24 * 30 },
    { name: "روز", value: 60 * 60 * 24 },
    { name: "ساعت", value: 60 * 60 },
    { name: "دقیقه", value: 60 },
    { name: "ثانیه", value: 1 },
  ];

  for (const unit of units) {
    const amount = Math.floor(diff / unit.value);
    if (amount >= 1) return `${amount} ${unit.name} پیش`;
  }

  return "همین الان";
};
export const getToken = async () => {
  if (typeof window === "undefined") {
    return null; // در سرور token موجود نیست
  }
  return localStorage.getItem(TOKEN_NAME);
};

export const isAuthenticated = async (): Promise<boolean> => {
  if (typeof window === "undefined") {
    return false; // در سرور همیشه false
  }

  const token = localStorage.getItem(TOKEN_NAME);
  const refreshToken = localStorage.getItem(REFRESH_TOKEN_NAME);

  // اگر هیچ توکنی وجود ندارد
  if (!token && !refreshToken) {
    return false;
  }

  // اگر توکن وجود دارد، فرض می‌کنیم معتبر است (axios interceptor refresh را هندل می‌کند)
  if (token) {
    return true;
  }

  // اگر فقط refresh token وجود دارد، سعی می‌کنیم refresh کنیم
  if (refreshToken) {
    try {
      const { refreshToken: refreshTokenAPI } = await import(
        "../app/auth/service/Service"
      );
      const data = await refreshTokenAPI({ token: refreshToken });

      if (data?.results?.data?.accessToken?.token) {
        await setToken(data.results.data.accessToken.token);
        if (data.results.data.refreshToken?.token) {
          await setRefreshToken(data.results.data.refreshToken.token);
        }
        return true;
      }
    } catch (error) {
      console.error("خطا در refresh token:", error);
      // پاک کردن توکن‌های نامعتبر
      await removeToken();
      await removeRefreshToken();
    }
  }

  return false;
};

export const getRefreshToken = async () => {
  if (typeof window === "undefined") {
    return null;
  }
  return localStorage.getItem(REFRESH_TOKEN_NAME);
};

export const setToken = (token: string) => {
  if (typeof window === "undefined") {
    return;
  }
  localStorage.setItem(TOKEN_NAME, token);
};

export const setRefreshToken = (refreshToken: string) => {
  if (typeof window === "undefined") {
    return;
  }
  localStorage.setItem(REFRESH_TOKEN_NAME, refreshToken);
};

export const removeToken = async () => {
  if (typeof window === "undefined") {
    return;
  }
  localStorage.removeItem(TOKEN_NAME);
};

export const removeRefreshToken = async () => {
  if (typeof window === "undefined") {
    return;
  }
  localStorage.removeItem(REFRESH_TOKEN_NAME);
};

export function toJalaliDate(
  date: Date | string | number,
  options?: Intl.DateTimeFormatOptions,
  locale: string = "fa-IR-u-ca-persian"
): string {
  const parsedDate = new Date(date);

  if (isNaN(parsedDate.getTime())) {
    return "";
    throw new Error("Invalid date provided to toJalaliDate");
  }

  const defaultOptions: Intl.DateTimeFormatOptions = {
    year: "numeric",
    month: "numeric",
    day: "numeric",
    // weekday: "long",
    // hour: "numeric",
    // minute: "numeric",
  };

  const formatter = new Intl.DateTimeFormat(locale, {
    ...defaultOptions,
    ...options,
  });

  return formatter.format(parsedDate);
}

export function limitHtmlWords(htmlString: string, wordLimit: number): string {
  // پاک کردن تگ‌ها
  const plainText = htmlString.replace(/<[^>]*>/g, "");

  // تقسیم و محدود کردن کلمات
  const words = plainText.split(/\s+/).slice(0, wordLimit);
  const result = words.join(" ") + "...";

  return result;
}

export const getStatusText = (status: string) => {
  const statusMap: { [key: string]: string } = {
    [OrdersStatus.wait_payment]: "در انتظار پرداخت",
    [OrdersStatus.process_by_seller]: "در حال پردازش",
    [OrdersStatus.shipped]: "در حال ارسال",
    [OrdersStatus.Delivered]: "تحویل شده",
    [OrdersStatus.Cancelled]: "لغو شده",
    [OrdersStatus.cancelled_system]: "لغو شده توسط سیستم",
  };
  return statusMap[status] || status;
};
