import { describe, expect, it } from 'vitest'
import {
  contextForAbbr,
  contextForAccount,
  contextForTrip,
  dashboardPath,
  mayOpenContext,
  ROLE_ABBR,
  tripPath,
} from '@/lib/page-context'

/** Role-specific page separation (article + Nash's route scheme, 2026-09-13). */

describe('route scheme — role abbreviation, one link, trip number', () => {
  it('uses FB / CD / PD / CT / PC', () => {
    expect(ROLE_ABBR).toEqual({ broker: 'fb', carrier: 'cd', 'pilot-company': 'pd', 'carrier-driver': 'ct', 'pilot-driver': 'pc' })
  })
  it('builds <abbr>-dashboard and <abbr>-trip-workspace/<trip number>', () => {
    expect(dashboardPath('carrier')).toBe('/cd-dashboard')
    expect(tripPath('carrier', 'HH-2041')).toBe('/cd-trip-workspace/HH-2041')
    expect(tripPath('pilot-driver', 'HH-2041')).toBe('/pc-trip-workspace/HH-2041')
    expect(contextForAbbr('pd')).toBe('pilot-company')
    expect(contextForAbbr('zz')).toBeNull()
  })
})

describe('dashboard context from the account role', () => {
  it('maps broker / dispatcher / driver; admin lands on broker', () => {
    expect(contextForAccount('broker')).toBe('broker')
    expect(contextForAccount('dispatcher')).toBe('carrier')
    expect(contextForAccount('driver')).toBe('carrier-driver')
    expect(contextForAccount('admin')).toBe('broker')
  })
  it('honours ?view= for internal admins only', () => {
    expect(contextForAccount('admin', 'driver', true)).toBe('carrier-driver')
    expect(contextForAccount('admin', 'pilot-dispatch', true)).toBe('pilot-company')
    expect(contextForAccount('admin', 'pilot-driver', true)).toBe('pilot-driver')
    expect(contextForAccount('driver', 'broker', false)).toBe('carrier-driver')
  })
})

describe('trip-view context — the role on this trip wins', () => {
  it('driver → carrier driver view, broker → broker view, dispatcher/pilot/shipper → carrier dispatch view', () => {
    expect(contextForTrip({ role: 'driver' }, 'dispatcher')).toBe('carrier-driver')
    expect(contextForTrip({ role: 'broker' }, 'dispatcher')).toBe('broker')
    expect(contextForTrip({ role: 'dispatcher' }, 'broker')).toBe('carrier')
    expect(contextForTrip({ role: 'pilot' }, 'driver')).toBe('carrier')
    expect(contextForTrip({ role: 'shipper' }, 'broker')).toBe('carrier')
  })
  it('falls back to the account role when not a participant (admin opening any trip)', () => {
    expect(contextForTrip(null, 'admin')).toBe('broker')
    expect(contextForTrip(null, 'driver')).toBe('carrier-driver')
  })
  it('internal ?view= still forces a view for testing', () => {
    expect(contextForTrip({ role: 'dispatcher' }, 'admin', 'driver', true)).toBe('carrier-driver')
    expect(contextForTrip({ role: 'dispatcher' }, 'broker', 'driver', false)).toBe('carrier')
  })
})

describe('who may open which route', () => {
  it('a customer opens only their own role; pilot pages are internal until pilot accounts exist', () => {
    expect(mayOpenContext('carrier', 'carrier', false)).toBe(true)
    expect(mayOpenContext('broker', 'carrier', false)).toBe(false)
    expect(mayOpenContext('pilot-company', 'carrier', false)).toBe(false)
    expect(mayOpenContext('pilot-driver', 'carrier-driver', false)).toBe(false)
  })
  it('internal admins may open anything (testing)', () => {
    expect(mayOpenContext('pilot-driver', 'broker', true)).toBe(true)
    expect(mayOpenContext('carrier-driver', 'broker', true)).toBe(true)
  })
})
