// Shared bits: confidence helpers, time helpers, ticker formatting
const CONF_ORDER = ['confirmed', 'high', 'medium', 'uncertain', 'guess', 'unknown'];
const CONF_LABELS = {
  confirmed: 'confirmed',
  high: 'high',
  medium: 'medium',
  uncertain: 'uncertain',
  guess: 'guess',
  unknown: 'unknown',
};

function confChipClass(conf) {
  return `conf-chip conf-${conf || 'unknown'}`;
}

function relTime(ts) {
  const ms = Date.now() - (typeof ts === 'number' ? ts : new Date(ts).getTime());
  if (ms < 60_000) return 'just now';
  if (ms < 3_600_000) return `${Math.floor(ms / 60_000)}m ago`;
  if (ms < 86_400_000) return `${Math.floor(ms / 3_600_000)}h ago`;
  return `${Math.floor(ms / 86_400_000)}d ago`;
}

function discordLink(meta, messageId) {
  if (!meta || !meta.guild_id || !meta.channel_id || !messageId) return '#';
  return `https://discord.com/channels/${meta.guild_id}/${meta.channel_id}/${messageId}`;
}

function mastheadDate(d = new Date()) {
  const days = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
  const months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
  const dd = String(d.getDate()).padStart(2, '0');
  return `${days[d.getDay()]} · ${dd} ${months[d.getMonth()]} ${d.getFullYear()}`;
}

const TICKER_GLYPH = {
  added: '+',
  promoted: '↑',
  demoted: '↓',
  rule: '§',
  example: '"',
};

// Admin auth helpers
const ADMIN_KEY = 'bonk-conlang-admin-token';
const ADMIN_MODE_KEY = 'bonk-conlang-admin-mode';

function adminHeaders(extra = {}) {
  const token = localStorage.getItem(ADMIN_KEY);
  return token ? { ...extra, 'X-Admin-Token': token } : extra;
}

function promptAdminToken() {
  const token = window.prompt('Admin token required:');
  if (token?.trim()) localStorage.setItem(ADMIN_KEY, token.trim());
  return token?.trim() || null;
}

function hasAdminToken() {
  return !!localStorage.getItem(ADMIN_KEY);
}

function isAdminMode() {
  return hasAdminToken() && localStorage.getItem(ADMIN_MODE_KEY) === '1';
}

function setAdminMode(on) {
  localStorage.setItem(ADMIN_MODE_KEY, on ? '1' : '0');
}

Object.assign(window, {
  CONF_ORDER, CONF_LABELS, confChipClass, relTime, discordLink, mastheadDate, TICKER_GLYPH,
  ADMIN_KEY, ADMIN_MODE_KEY, adminHeaders, promptAdminToken, hasAdminToken, isAdminMode, setAdminMode,
});
