import { describe, expect, it } from 'vitest'
import {
  getEffectiveWorkspaceRole,
  roleAllowsAccess,
  type WorkspaceAccess,
  type WorkspaceRole,
  type WorkspaceAccessInput,
} from './workspace-access'

function accessInput(overrides: Partial<WorkspaceAccessInput> = {}): WorkspaceAccessInput {
  return {
    userId: 'user_member',
    workspaceOwnerUserId: 'user_owner',
    workspaceDirectRole: null,
    ...overrides,
  }
}

describe('getEffectiveWorkspaceRole', () => {
  it('grants owner role to the workspace owner', () => {
    expect(getEffectiveWorkspaceRole(accessInput({ userId: 'user_owner' }))).toBe('owner')
  })

  it('uses a direct workspace role when user is not owner', () => {
    expect(getEffectiveWorkspaceRole(accessInput({ workspaceDirectRole: 'viewer' }))).toBe('viewer')
  })

  it('returns null when no direct access applies', () => {
    expect(getEffectiveWorkspaceRole(accessInput())).toBeNull()
  })
})

describe('roleAllowsAccess', () => {
  it.each([
    ['owner', 'read', true],
    ['owner', 'write', true],
    ['owner', 'admin', true],
    ['admin', 'read', true],
    ['admin', 'write', true],
    ['admin', 'admin', true],
    ['member', 'read', true],
    ['member', 'write', true],
    ['member', 'admin', false],
    ['viewer', 'read', true],
    ['viewer', 'write', false],
    ['viewer', 'admin', false],
    [null, 'read', false],
    [null, 'admin', false],
  ] as Array<[WorkspaceRole | null, WorkspaceAccess, boolean]>)(
    'checks whether role %s allows %s access',
    (role, access, expected) => {
      expect(roleAllowsAccess(role, access)).toBe(expected)
    },
  )
})
