import Cookies from 'js-cookie';

const TOKEN_COOKIE_NAME = 'st';
const DEVICE_ID_COOKIE_NAME = 'sd';

// 生成设备ID的函数
function generateDeviceId(): string {
  const timestamp = Date.now().toString(36);
  const randomStr = Math.random().toString(36).substring(2, 15);
  const browserInfo =
    typeof window !== 'undefined'
      ? `${window.navigator.userAgent}${window.screen.width}${window.screen.height}`
          .replace(/\s/g, '')
          .substring(0, 10)
      : 'server';

  return `did_${timestamp}_${randomStr}_${browserInfo}`.toLowerCase();
}

const cookieSecure = false;
export const tokenManager = {
  // 获取token - 支持客户端和服务端
  getToken: (cookieString?: string): string | null => {
    // 服务端环境，从传入的cookie字符串中解析
    if (typeof window === 'undefined' && cookieString) {
      const cookies = parseCookieString(cookieString);
      return cookies[TOKEN_COOKIE_NAME] || null;
    }

    // 客户端环境，从document.cookie或localStorage获取
    if (typeof window !== 'undefined') {
      // 优先从cookie获取
      const cookieToken = Cookies.get(TOKEN_COOKIE_NAME);
      if (cookieToken) {
        return cookieToken;
      }

      // 兼容原有的localStorage存储
      const localToken = window.localStorage.getItem('token');
      if (localToken) {
        // 迁移到cookie
        tokenManager.setToken(localToken);
        window.localStorage.removeItem('token');
        return localToken;
      }
    }

    return null;
  },

  // 获取设备ID - 支持客户端和服务端
  getDeviceId: (cookieString?: string): string => {
    // 服务端环境，从传入的cookie字符串中解析
    if (typeof window === 'undefined' && cookieString) {
      const cookies = parseCookieString(cookieString);
      let deviceId = cookies[DEVICE_ID_COOKIE_NAME];

      // 如果服务端没有设备ID，生成一个临时的
      if (!deviceId) {
        deviceId = generateDeviceId();
      }

      return deviceId;
    }

    // 客户端环境
    if (typeof window !== 'undefined') {
      let deviceId = Cookies.get(DEVICE_ID_COOKIE_NAME);

      // 如果没有设备ID，生成一个新的
      if (!deviceId) {
        deviceId = generateDeviceId();
        tokenManager.setDeviceId(deviceId);
      }

      return deviceId;
    }

    // 兜底情况，生成临时设备ID
    return generateDeviceId();
  },

  // 设置token
  setToken: (token: string): void => {
    if (typeof window !== 'undefined') {
      Cookies.set(TOKEN_COOKIE_NAME, token, {
        expires: 365,
        secure: cookieSecure,
        sameSite: 'lax',
      });
    }
  },

  // 设置设备ID
  setDeviceId: (deviceId: string): void => {
    if (typeof window !== 'undefined') {
      // 设置cookie，365天过期（设备ID应该长期保存）
      Cookies.set(DEVICE_ID_COOKIE_NAME, deviceId, {
        expires: 365,
        secure: cookieSecure,
        sameSite: 'lax',
      });
    }
  },

  // 清除token（但保留设备ID）
  removeToken: (): void => {
    if (typeof window !== 'undefined') {
      console.log('remove token');
      // 删除cookie时需要指定与设置时相同的选项
      Cookies.remove(TOKEN_COOKIE_NAME, {
        secure: cookieSecure,
        sameSite: 'lax',
        path: '/',
      });
      // 同时清除可能存在的localStorage token
      window.localStorage.removeItem('token');
      // 注意：这里不清除设备ID
    }
  },

  // 清除所有数据（包括设备ID）
  clearAll: (): void => {
    if (typeof window !== 'undefined') {
      const cookieOptions = {
        secure: cookieSecure,
        sameSite: 'lax' as const,
        path: '/',
      };
      Cookies.remove(TOKEN_COOKIE_NAME, cookieOptions);
      Cookies.remove(DEVICE_ID_COOKIE_NAME, cookieOptions);
      window.localStorage.removeItem('token');
    }
  },

  // 检查是否已登录
  isAuthenticated: (cookieString?: string): boolean => {
    return !!tokenManager.getToken(cookieString);
  },

  // 初始化设备ID（确保用户第一次访问时就有设备ID）
  initializeDeviceId: (): void => {
    if (typeof window !== 'undefined') {
      tokenManager.getDeviceId(); // 这会自动生成并保存设备ID（如果不存在的话）
    }
  },
};

// 解析cookie字符串的辅助函数
function parseCookieString(cookieString: string): Record<string, string> {
  const cookies: Record<string, string> = {};

  cookieString.split(';').forEach((cookie) => {
    const [name, ...rest] = cookie.trim().split('=');
    if (name) {
      cookies[name] = rest.join('=');
    }
  });

  return cookies;
}
