import { describe, expect, it } from 'vitest'
import { canManageStatus, canTransition, statusAfterPermitProcessed } from '@/lib/domain/status'

describe('trip status machine', () => {
  it('follows the meeting flow: waiting → active → completed', () => {
    expect(canTransition('waiting_for_permits', 'active')).toBe(true)
    expect(canTransition('active', 'completed')).toBe(true)
  })

  it('allows cancelling non-terminal trips', () => {
    expect(canTransition('draft', 'cancelled')).toBe(true)
    expect(canTransition('waiting_for_permits', 'cancelled')).toBe(true)
    expect(canTransition('active', 'cancelled')).toBe(true)
  })

  it('blocks invalid transitions', () => {
    expect(canTransition('completed', 'waiting_for_permits')).toBe(false)
    expect(canTransition('cancelled', 'active')).toBe(false)
    expect(canTransition('active', 'draft')).toBe(false)
  })

  it('allows reopening a completed trip (look back in time, then continue)', () => {
    expect(canTransition('completed', 'active')).toBe(true)
  })

  it('first processed permit activates a waiting trip', () => {
    expect(statusAfterPermitProcessed('waiting_for_permits')).toBe('active')
    expect(statusAfterPermitProcessed('draft')).toBe('active')
    expect(statusAfterPermitProcessed('active')).toBe('active')
    expect(statusAfterPermitProcessed('completed')).toBe('completed')
  })

  it('only broker/dispatcher/admin manage status', () => {
    expect(canManageStatus('broker')).toBe(true)
    expect(canManageStatus('dispatcher')).toBe(true)
    expect(canManageStatus('admin')).toBe(true)
    expect(canManageStatus('driver')).toBe(false)
    expect(canManageStatus('pilot')).toBe(false)
    expect(canManageStatus('shipper')).toBe(false)
  })
})
