import { sql } from 'drizzle-orm'
import { beforeEach, describe, expect, it } from 'vitest'
import { createPgliteClient } from '../../db/src/postgres/pglite.js'
import { createDbSubmissionStore } from './store.js'
import { formSubmissions, formsSchema, formsTableSql } from './schema.js'

describe('forms drizzle table shape', () => {
  it('exposes expected column names', () => {
    const cols = Object.keys(formSubmissions)
    expect(cols).toContain('id')
    expect(cols).toContain('formId')
    expect(cols).toContain('data')
    expect(cols).toContain('meta')
    expect(cols).toContain('spam')
    expect(cols).toContain('createdAt')
  })

  it('id is the primary key', () => {
    expect(formSubmissions.id.primary).toBe(true)
  })
})

describe('formsTableSql', () => {
  it('default table name is form_submissions', () => {
    const ddl = formsTableSql()
    expect(ddl).toMatch(/CREATE TABLE IF NOT EXISTS form_submissions/)
  })

  it('contains all required columns', () => {
    const ddl = formsTableSql()
    for (const col of ['id', 'form_id', 'data', 'meta', 'spam', 'created_at']) {
      expect(ddl).toContain(col)
    }
  })

  it('contains form_submissions_form_created_idx on (form_id, created_at desc)', () => {
    const ddl = formsTableSql()
    expect(ddl).toContain('form_submissions_form_created_idx')
    expect(ddl).toMatch(/form_id,\s*created_at\s+DESC/i)
  })

  it('applies per-statement-split and supports createDbSubmissionStore round-trip', async () => {
    const db = createPgliteClient({ schema: formsSchema })
    const ddl = formsTableSql()
    for (const stmt of ddl.split(';').map((s) => s.trim()).filter(Boolean)) {
      await db.execute(sql.raw(stmt))
    }
    const store = createDbSubmissionStore(db)
    const rec = await store.record({ formId: 'contact', data: { email: 'a@b.co' } })
    expect(rec.id).toBeTruthy()
    const got = await store.get('contact', rec.id)
    expect(got?.data.email).toBe('a@b.co')
  })
})
