import { createSign } from 'node:crypto'
import { config } from '../config.js'

export type LicensePayload = {
  app: 'StackLogic'
  edition: 'full'
  issuedTo: string
  issuedAt: string
  expiresAt?: string
}

function normalizePrivateKey(value: string) {
  return value.replace(/\\n/g, '\n')
}

function base64Url(input: string) {
  return Buffer.from(input)
    .toString('base64')
    .replace(/=/g, '')
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
}

export function generateStackLogicLicenseKey({ issuedTo, expiresAt }: { issuedTo: string; expiresAt?: string | null }) {
  const payload: LicensePayload = {
    app: 'StackLogic',
    edition: 'full',
    issuedTo,
    issuedAt: new Date().toISOString(),
  }

  if (expiresAt) {
    payload.expiresAt = new Date(expiresAt).toISOString()
  }

  const payloadPart = base64Url(JSON.stringify(payload))
  const signer = createSign('RSA-SHA256')
  signer.update(payloadPart)
  signer.end()

  return {
    payload,
    licenseKey: `${payloadPart}.${signer.sign(normalizePrivateKey(config.STACKLOGIC_LICENSE_PRIVATE_KEY), 'base64url')}`,
  }
}
