import { readFileSync, readdirSync } from 'node:fs'
import { join } from 'node:path'
import { describe, expect, it } from 'vitest'

type JournalEntry = {
  idx: number
  tag: string
}

function readJson<T>(path: string): T {
  return JSON.parse(readFileSync(path, 'utf8')) as T
}

describe('platform migration journal', () => {
  it('keeps SQL and journal counts aligned', () => {
    const migrationsDir = join(process.cwd(), 'migrations')
    const journal = readJson<{ entries: JournalEntry[] }>(
      join(migrationsDir, 'meta', '_journal.json'),
    )
    const sqlCount = readdirSync(migrationsDir).filter((name) => name.endsWith('.sql')).length
    expect(sqlCount).toBe(journal.entries.length)
  })

  it('records every authored platform migration in order', () => {
    const migrationsDir = join(process.cwd(), 'migrations')
    const journalPath = join(migrationsDir, 'meta', '_journal.json')
    const journal = readJson<{ entries: JournalEntry[] }>(journalPath)

    const platformTags = journal.entries
      .filter((entry) => entry.tag.startsWith('006'))
      .map((entry) => entry.tag)

    expect(platformTags).toEqual([
      '0060_kb_publish_permission',
      '0061_recurring_invoice_constraints',
      '0062_invoices_recurring_period_start',
      '0063_platform_jobs',
      '0064_platform_tenancy',
      '0065_platform_audit',
      '0066_platform_helpdesk',
      '0068_schema_drift_consolidated',
      '0069_shell_layouts',
    ])
  })
})
