import type { LicenseStatus } from '@prisma/client'

type AdminIdentity = {
  id: string
  email: string
  name: string | null
}

export function escapeHtml(value: unknown) {
  return String(value ?? '')
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;')
}

export function dollars(cents?: number | null, currency?: string | null) {
  if (typeof cents !== 'number') return '-'
  return new Intl.NumberFormat('en-US', {
    style: 'currency',
    currency: (currency || 'usd').toUpperCase(),
  }).format(cents / 100)
}

export function dateTime(value?: Date | string | null) {
  if (!value) return '-'
  return new Intl.DateTimeFormat('en-US', {
    dateStyle: 'medium',
    timeStyle: 'short',
  }).format(new Date(value))
}

export function shortKey(value: string) {
  if (value.length <= 28) return value
  return `${value.slice(0, 14)}...${value.slice(-10)}`
}

export function statusBadge(status: string) {
  return `<span class="badge ${escapeHtml(status)}">${escapeHtml(status)}</span>`
}

export function licenseStatusOptions(selected?: LicenseStatus | 'all') {
  const values = ['all', 'active', 'disabled', 'replaced', 'revoked', 'archived']
  return values.map((value) =>
    `<option value="${value}" ${value === selected ? 'selected' : ''}>${value}</option>`,
  ).join('')
}

export function layout(input: {
  title: string
  admin?: AdminIdentity
  csrfToken?: string
  body: string
}) {
  const nav = input.admin
    ? `<nav>
        <a href="/admin/licenses">Licenses</a>
        <a href="/admin/manual-license">Manual License</a>
        <form method="post" action="/admin/logout">
          <input type="hidden" name="_csrf" value="${escapeHtml(input.csrfToken)}">
          <button type="submit">Sign Out</button>
        </form>
      </nav>`
    : ''

  return `<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>${escapeHtml(input.title)} | StackLogic Licensing</title>
  <link rel="stylesheet" href="/admin/styles.css">
</head>
<body>
  <header class="topbar">
    <div>
      <p>StackLogic Internal</p>
      <h1>${escapeHtml(input.title)}</h1>
    </div>
    ${nav}
  </header>
  <main>${input.body}</main>
</body>
</html>`
}
