import { tabBadgeTone } from '@platform-modules/ui-primitives/Tabs';
import type { Actor } from '@platform-modules/commerce-orders';
import { env } from 'cloudflare:workers';
import { getDb, MissingDatabaseError, type DbEnv, type DbResult } from './db.js';

export const ADMIN_ACTOR: Actor = { isAdmin: true };

export { tabBadgeTone };

export function badgeClassesForTone(tone: 'neutral' | 'warning' | 'danger'): string {
  const base = 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium';
  switch (tone) {
    case 'warning':
      return `${base} bg-amber-100 text-amber-800`;
    case 'danger':
      return `${base} bg-red-100 text-red-800`;
    default:
      return `${base} bg-gray-100 text-gray-700`;
  }
}

export type DbLoadResult =
  | { ok: true; db: DbResult['db']; dialect: DbResult['dialect'] }
  | { ok: false; error: string };

export function loadAdminDb(): DbLoadResult {
  const cfEnv = env as DbEnv | undefined;
  if (!cfEnv?.DB && !cfEnv?.DATABASE_URL) {
    return { ok: false, error: 'Database is not configured.' };
  }
  try {
    const { db, dialect } = getDb(cfEnv);
    return { ok: true, db, dialect };
  } catch (e) {
    if (e instanceof MissingDatabaseError) {
      return { ok: false, error: e.message };
    }
    return { ok: false, error: e instanceof Error ? e.message : 'Failed to connect to database.' };
  }
}

export function formatDateTime(value: Date | string | null | undefined): string {
  if (!value) return '—';
  const d = value instanceof Date ? value : new Date(value);
  if (Number.isNaN(d.getTime())) return '—';
  return d.toLocaleString();
}

export function formatBuyer(buyerRef: { userId: string } | { guestEmail: string }): string {
  return 'userId' in buyerRef ? `User ${buyerRef.userId}` : buyerRef.guestEmail;
}

export function maskSecretKey(key: string | null | undefined): string {
  if (!key?.trim()) return '(not configured)';
  const trimmed = key.trim();
  if (trimmed.length <= 4) return '****';
  return `••••${trimmed.slice(-4)}`;
}
