// Pure helpers for project_members. UI lives in components/pmo/.

export type MemberRole =
  | 'plt_leader'
  | 'taskforce_leader'
  | 'workstream_owner'
  | 'team_leader'
  | 'member'

export interface RoleOption {
  value: MemberRole
  label: string
  /** lower = higher in display sort order */
  priority: number
}

export const ROLE_OPTIONS: ReadonlyArray<RoleOption> = [
  { value: 'plt_leader', label: 'PLT-Leiter', priority: 1 },
  { value: 'taskforce_leader', label: 'Taskforce-Leiter', priority: 2 },
  { value: 'workstream_owner', label: 'Workstream-Owner', priority: 3 },
  { value: 'team_leader', label: 'Team-Leiter', priority: 4 },
  { value: 'member', label: 'Mitglied', priority: 5 },
]

const ROLE_VALUES = new Set(ROLE_OPTIONS.map((r) => r.value))

export function isValidRole(v: unknown): v is MemberRole {
  return typeof v === 'string' && ROLE_VALUES.has(v as MemberRole)
}

export function isValidLevel(v: number | null | undefined): boolean {
  if (v === null || v === undefined) return true
  if (!Number.isInteger(v)) return false
  return v >= 1 && v <= 5
}

export interface ProjectMember {
  id: string
  display_name: string
  role: MemberRole
  level: number | null
  org: string | null
  workstream_id: string | null
}

const ROLE_PRIORITY: Record<MemberRole, number> = Object.fromEntries(
  ROLE_OPTIONS.map((r) => [r.value, r.priority]),
) as Record<MemberRole, number>

export function sortMembers(members: ProjectMember[]): ProjectMember[] {
  return [...members].sort((a, b) => {
    const ra = ROLE_PRIORITY[a.role] ?? 99
    const rb = ROLE_PRIORITY[b.role] ?? 99
    if (ra !== rb) return ra - rb
    const la = a.level ?? Number.POSITIVE_INFINITY
    const lb = b.level ?? Number.POSITIVE_INFINITY
    if (la !== lb) return la - lb
    return a.display_name.localeCompare(b.display_name, 'de')
  })
}
