import { describe, expect, it } from 'vitest'
import {
  createFlatRbac,
  DEFAULT_FLAT_ROLE_CAPABILITIES,
} from './rbac-flat.js'
import {
  createMemoryTenancyStore,
  createTenancy,
  type ScopedQuerier,
} from './index.js'

describe('createFlatRbac', () => {
  it('resolves moderator capabilities from the static map', async () => {
    const rbac = createFlatRbac()
    const caps = await rbac.resolveCapabilities({
      userId: 'user-1',
      tenantId: 'tenant-1',
      roleKey: 'moderator',
    })
    expect(caps).toEqual([...DEFAULT_FLAT_ROLE_CAPABILITIES.moderator])
  })

  it('returns [] for an unmapped role (fail-closed)', async () => {
    const rbac = createFlatRbac()
    await expect(
      rbac.resolveCapabilities({
        userId: 'user-1',
        tenantId: 'tenant-1',
        roleKey: 'superuser',
      }),
    ).resolves.toEqual([])
  })

  it('resolveCapabilities works without triad tables when wired through createTenancy', async () => {
    const store = createMemoryTenancyStore()
    const tenancy = createTenancy({
      store,
      isolation: { scopeQuerier: (q) => q as unknown as ScopedQuerier },
      rbac: createFlatRbac(),
    })
    const tenant = await tenancy.createTenant({
      slug: 'forum',
      name: 'Forum',
      ownerId: 'owner-1',
    })
    await store.addMember({
      tenantId: tenant.id,
      userId: 'mod-1',
      roleKey: 'moderator',
      status: 'active',
    })
    const caps = await tenancy.resolveCapabilities('mod-1', tenant.id)
    expect(caps).toContain('moderate_posts')
  })

  it('returns [] for frozen membership via createTenancy (fail-closed)', async () => {
    const store = createMemoryTenancyStore()
    const tenancy = createTenancy({
      store,
      isolation: { scopeQuerier: (q) => q as unknown as ScopedQuerier },
      rbac: createFlatRbac(),
    })
    const tenant = await tenancy.createTenant({
      slug: 'forum',
      name: 'Forum',
      ownerId: 'owner-1',
    })
    await store.addMember({
      tenantId: tenant.id,
      userId: 'mod-1',
      roleKey: 'moderator',
      status: 'frozen',
    })
    await expect(tenancy.resolveCapabilities('mod-1', tenant.id)).resolves.toEqual([])
  })
})
