// HTTP API 客户端：对接安全信令服务器的账号体系与自助接口。
// 令牌存储策略（参考服务端实现约束）：
//   - accessToken：内存中保存（掉线即失，需重新登录）；
//   - refreshToken：sessionStorage（一次性、ses_ 前缀，页面关闭即清除，降低泄露面）。
const API_BASE = (import.meta.env.VITE_API_BASE || 'https://www.ttstd.com').replace(/\/$/, '');

const ACCESS_KEY = 'ttstd.accessToken';
const REFRESH_KEY = 'ttstd.refreshToken';

let accessToken = sessionStorage.getItem(ACCESS_KEY) || '';
let refreshToken = sessionStorage.getItem(REFRESH_KEY) || '';
// 刷新单飞：避免并发请求同时触发多次刷新。
let refreshing = null;

export function getAccessToken() {
  return accessToken;
}

export function isLoggedIn() {
  return !!accessToken;
}

export function setTokens({ accessToken: at, refreshToken: rt }) {
  accessToken = at || '';
  if (rt) refreshToken = rt;
  if (accessToken) sessionStorage.setItem(ACCESS_KEY, accessToken);
  else sessionStorage.removeItem(ACCESS_KEY);
  if (refreshToken) sessionStorage.setItem(REFRESH_KEY, refreshToken);
  else sessionStorage.removeItem(REFRESH_KEY);
}

export function clearTokens() {
  accessToken = '';
  refreshToken = '';
  sessionStorage.removeItem(ACCESS_KEY);
  sessionStorage.removeItem(REFRESH_KEY);
}

async function request(path, { method = 'POST', body, auth = false } = {}) {
  const headers = { 'Content-Type': 'application/json' };
  if (auth && accessToken) headers['Authorization'] = 'Bearer ' + accessToken;
  const res = await fetch(API_BASE + path, {
    method,
    headers,
    body: body ? JSON.stringify(body) : undefined,
  });
  if (res.status === 401) {
    // 可能是 accessToken 失效，由调用方决定是否刷新。
    const data = await res.json().catch(() => ({}));
    const err = new Error(data.error || 'UNAUTHORIZED');
    err.code = data.code || 'UNAUTHORIZED';
    err.status = 401;
    throw err;
  }
  if (!res.ok) {
    const data = await res.json().catch(() => ({}));
    const err = new Error(data.error || ('HTTP ' + res.status));
    err.code = data.code;
    err.status = res.status;
    throw err;
  }
  return res.json();
}

export async function login(username, password) {
  const data = await request('/api/auth/login', { body: { username, password } });
  setTokens({ accessToken: data.accessToken, refreshToken: data.refreshToken });
  return data;
}

export async function register(body) {
  return request('/api/auth/register', { body });
}

export async function logout() {
  if (refreshToken) {
    try { await request('/api/auth/logout', { method: 'POST', body: { refreshToken } }); } catch { /* ignore */ }
  }
  clearTokens();
}

// 刷新令牌：带单飞锁，并发调用共享同一次刷新结果。
export async function refresh() {
  if (!refreshToken) {
    clearTokens();
    throw new Error('NO_REFRESH_TOKEN');
  }
  if (refreshing) return refreshing;
  refreshing = (async () => {
    try {
      const data = await request('/api/auth/refresh', { body: { refreshToken } });
      // 服务端可能轮换 refreshToken（一次性），若返回新的则覆盖。
      setTokens({ accessToken: data.accessToken, refreshToken: data.refreshToken });
      return data;
    } finally {
      refreshing = null;
    }
  })();
  return refreshing;
}

// 令牌校验（可选，用于启动恢复时确认 accessToken 是否有效）。
export async function verify() {
  return request('/api/client/verify', { method: 'GET', auth: true });
}

// 取本机可连接的被控端列表（仅返回已绑定的设备）。
export async function listBindings() {
  return request('/api/client/bindings', { method: 'GET', auth: true });
}

// 拉取 TURN 短期凭证（服务端开启时返回 iceServers）。
export async function fetchTurnCredentials() {
  try {
    return await request('/api/client/turn-credentials', { method: 'GET', auth: true });
  } catch {
    return null;
  }
}
