const TOKEN_KEY = "token";

/**
 * 从当前 URL 路径中提取租户编码
 */
function getTenantCodeFromUrl(): string | null {
  let path = window.location.pathname;

  // 去掉 base 路径前缀（如 /web-test/ 或 /web/）
  const base = import.meta.env.BASE_URL || "/";
  if (base !== "/" && path.startsWith(base)) {
    path = path.slice(base.length - 1); // 保留开头的 /
  }

  const match = path.match(/^\/([^/]+)/);
  return match ? match[1] : null;
}

/**
 * 设置 Cookie
 */
function setCookie(
  name: string,
  value: string,
  options: { path?: string; expires?: number; maxAge?: number } = {}
): void {
  const { path = "/", expires, maxAge } = options;
  let cookieString = `${name}=${encodeURIComponent(value)}; path=${path}`;

  if (expires) {
    const date = new Date();
    date.setTime(date.getTime() + expires * 1000);
    cookieString += `; expires=${date.toUTCString()}`;
  }

  if (maxAge) {
    cookieString += `; max-age=${maxAge}`;
  }

  document.cookie = cookieString;
}

/**
 * 获取 Cookie
 */
function getCookie(name: string): string | null {
  const nameEQ = name + "=";
  const ca = document.cookie.split(";");
  for (let i = 0; i < ca.length; i++) {
    let c = ca[i];
    while (c.charAt(0) === " ") c = c.substring(1, c.length);
    if (c.indexOf(nameEQ) === 0) {
      return decodeURIComponent(c.substring(nameEQ.length, c.length));
    }
  }
  return null;
}

/**
 * 删除 Cookie（通过设置过期时间）
 */
function removeCookie(name: string, path: string = "/"): void {
  document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${path}`;
}

/**
 * 获取所有可能的 token cookie（因为不同租户可能有不同的 path）
 */
function getAllTokenCookies(): string | null {
  // 直接尝试从当前路径获取 cookie
  // 注意：由于 cookie 的 path 限制，我们只能读取当前路径或其父路径下的 cookie
  // 如果 cookie 的 path 是 /tenant_code，那么只有在 /tenant_code/* 路径下才能读取
  return getCookie(TOKEN_KEY);
}

export const getToken = (): string | null => {
  return getAllTokenCookies();
};

export const setToken = (token: string, tenantCode?: string): void => {
  // 始终将 token 存储在根路径下，确保所有页面都能访问
  const base = import.meta.env.BASE_URL || "/";
  const basePath = base.endsWith("/") ? base.slice(0, -1) : base;
  const path = basePath || "/";

  // 设置 cookie，过期时间设置为 7 天
  const expires = 7 * 24 * 60 * 60; // 7 天（秒）
  setCookie(TOKEN_KEY, token, { path, expires });
};

export const removeToken = (_tenantCode?: string): void => {
  // 删除根路径下的 cookie
  const base = import.meta.env.BASE_URL || "/";
  const basePath = base.endsWith("/") ? base.slice(0, -1) : base;
  removeCookie(TOKEN_KEY, basePath || "/");
};

/**
 * 获取租户编码（从 URL 路径中获取）
 * 注意：这些函数不再使用 localStorage，只从 URL 或用户信息中获取
 */
export const getTenantCode = (): string | null => {
  return getTenantCodeFromUrl();
};

/**
 * 设置租户编码（已废弃，不再存储到 localStorage）
 * 保留此函数以保持兼容性，但不执行任何操作
 */
export const setTenantCode = (_tenantCode: string): void => {
  // 不再存储到 localStorage，租户编码从 URL 或用户信息中获取
};

/**
 * 移除租户编码（已废弃，不再从 localStorage 删除）
 * 保留此函数以保持兼容性，但不执行任何操作
 */
export const removeTenantCode = (): void => {
  // 不再从 localStorage 删除，租户编码从 URL 或用户信息中获取
};

/**
 * 获取租户ID（已废弃，不再从 localStorage 获取）
 * 保留此函数以保持兼容性，返回 null
 */
export const getTenantId = (): string | null => {
  // 不再从 localStorage 获取，租户ID 从用户信息中获取
  return null;
};

/**
 * 设置租户ID（已废弃，不再存储到 localStorage）
 * 保留此函数以保持兼容性，但不执行任何操作
 */
export const setTenantId = (_tenantId: number | string): void => {
  // 不再存储到 localStorage，租户ID 从用户信息中获取
};

/**
 * 移除租户ID（已废弃，不再从 localStorage 删除）
 * 保留此函数以保持兼容性，但不执行任何操作
 */
export const removeTenantId = (): void => {
  // 不再从 localStorage 删除，租户ID 从用户信息中获取
};

export const clearAuth = (): void => {
  // 只清除 token，租户信息不再存储在 localStorage
  removeToken();
};
