import { describe, it, expect } from 'vitest'
import {
  ROLE_OPTIONS,
  isValidRole,
  isValidLevel,
  sortMembers,
  type ProjectMember,
} from '@/lib/pmo/members'

describe('ROLE_OPTIONS', () => {
  it('has the 5 canonical roles in display order', () => {
    expect(ROLE_OPTIONS.map((r) => r.value)).toEqual([
      'plt_leader',
      'taskforce_leader',
      'workstream_owner',
      'team_leader',
      'member',
    ])
  })
})

describe('isValidRole', () => {
  it('accepts the 5 canonical roles', () => {
    for (const r of ['plt_leader', 'taskforce_leader', 'workstream_owner', 'team_leader', 'member']) {
      expect(isValidRole(r)).toBe(true)
    }
  })
  it('rejects unknown values', () => {
    expect(isValidRole('owner')).toBe(false)
    expect(isValidRole('')).toBe(false)
    expect(isValidRole(null)).toBe(false)
  })
})

describe('isValidLevel', () => {
  it('accepts 1..5', () => {
    expect(isValidLevel(1)).toBe(true)
    expect(isValidLevel(5)).toBe(true)
  })
  it('rejects 0, 6, negatives, non-int', () => {
    expect(isValidLevel(0)).toBe(false)
    expect(isValidLevel(6)).toBe(false)
    expect(isValidLevel(-1)).toBe(false)
    expect(isValidLevel(2.5)).toBe(false)
  })
  it('accepts null (level is optional)', () => {
    expect(isValidLevel(null)).toBe(true)
  })
})

describe('sortMembers', () => {
  function mk(over: Partial<ProjectMember>): ProjectMember {
    return {
      id: 'x',
      display_name: '',
      role: 'member',
      level: null,
      org: null,
      workstream_id: null,
      ...over,
    }
  }

  it('sorts by role priority first (plt_leader > member)', () => {
    const sorted = sortMembers([
      mk({ id: 'a', role: 'member', display_name: 'A' }),
      mk({ id: 'b', role: 'plt_leader', display_name: 'B' }),
    ])
    expect(sorted.map((m) => m.id)).toEqual(['b', 'a'])
  })

  it('within same role: lower level first', () => {
    const sorted = sortMembers([
      mk({ id: 'a', role: 'member', display_name: 'A', level: 3 }),
      mk({ id: 'b', role: 'member', display_name: 'B', level: 1 }),
    ])
    expect(sorted.map((m) => m.id)).toEqual(['b', 'a'])
  })

  it('null level comes after numbered levels', () => {
    const sorted = sortMembers([
      mk({ id: 'a', role: 'member', display_name: 'A', level: null }),
      mk({ id: 'b', role: 'member', display_name: 'B', level: 5 }),
    ])
    expect(sorted.map((m) => m.id)).toEqual(['b', 'a'])
  })

  it('tiebreak: alphabetical by display_name', () => {
    const sorted = sortMembers([
      mk({ id: 'a', role: 'member', display_name: 'Zoe', level: 1 }),
      mk({ id: 'b', role: 'member', display_name: 'Anna', level: 1 }),
    ])
    expect(sorted.map((m) => m.id)).toEqual(['b', 'a'])
  })
})
