import { DateTime } from 'luxon'
import ActivityEvent from '#models/activity_event'
import * as clock from '#services/clock'
import type { TransactionClientContract } from '@adonisjs/lucid/types/database'

type EventKind = 'relance_sent' | 'invoice_paid' | 'invoice_imported' | 'warning_drafted'

type RecordOpts = {
  organizationId: string
  kind: EventKind
  label: string
  meta?: Record<string, unknown>
  at?: DateTime
  trx?: TransactionClientContract
}

/**
 * Enregistre un événement dans le journal d'activité (append-only).
 * Appelé depuis :
 *  - SendRelanceJob (relance_sent)
 *  - InvoicesController.markPaid (invoice_paid)
 *  - ImportBatchesController.validateDraft (invoice_imported)
 *  - SendRelanceJob quand step.requires_manual_validation (warning_drafted)
 *
 * Les labels acceptent un HTML léger (<b>) pour permettre au SPA de
 * mettre en gras les noms d'entité — toujours composé côté serveur,
 * jamais d'input utilisateur brut.
 */
export async function recordActivity(opts: RecordOpts): Promise<ActivityEvent> {
  const { organizationId, kind, label, meta = {}, at, trx } = opts
  return ActivityEvent.create(
    {
      organizationId,
      kind,
      label,
      meta,
      at: at ?? (await clock.now(organizationId)),
    },
    trx ? { client: trx } : undefined
  )
}
