import { describe, expect, it } from 'vitest'
import {
  canManageCarrierCompany, carrierCompanyBadge, companyInfoView, isEditableCompanyField, mcDotLine,
  membershipTransition, permissionLevel, relationshipStatus,
} from '@/lib/domain/carrier-company'
import type { CompanyMembership } from '@/types/db'

/**
 * Carrier Dashboard → Company Info (Nash, 2026-09-19): a pending dispatcher
 * sees verification status only; a verified dispatcher sees the company but
 * cannot manage it; a Carrier Company Admin manages profile and
 * relationships; a HeavyHaul admin gets everything for support.
 */

const base = (over: Partial<CompanyMembership>): CompanyMembership => ({
  id: 'm1', user_id: 'u1', company_id: 'c1', role: 'carrier_dispatcher', status: 'approved',
  approved_by: null, approved_at: null, revoked_by: null, revoked_at: null, created_at: '2026-09-19', ...over,
})

describe('relationship status', () => {
  it('maps membership status to the words the dashboard uses', () => {
    expect(relationshipStatus('pending')).toBe('pending')
    expect(relationshipStatus('approved')).toBe('verified')
    expect(relationshipStatus('rejected')).toBe('rejected')
    expect(relationshipStatus('revoked')).toBe('revoked')
    expect(relationshipStatus(null)).toBe('none')
  })
})

describe('permission level', () => {
  it('reads the column when present, else owner/admin roles imply company_admin (pre-0021)', () => {
    expect(permissionLevel(base({ permission_level: 'company_admin' }))).toBe('company_admin')
    expect(permissionLevel(base({ role: 'company_owner' }))).toBe('company_admin')
    expect(permissionLevel(base({ role: 'carrier_dispatcher' }))).toBe('member')
    expect(permissionLevel(base({ role: 'company_owner', permission_level: 'member' }))).toBe('member')
    expect(permissionLevel(null)).toBe('member')
  })
})

describe('which Company Info view', () => {
  it('STATE 1 — pending dispatcher sees the waiting screen', () => {
    expect(companyInfoView({ membership: base({ status: 'pending' }), viewerIsPlatformAdmin: false })).toBe('pending')
  })
  it('STATE 2 — verified member sees the read-only company page', () => {
    expect(companyInfoView({ membership: base({}), viewerIsPlatformAdmin: false })).toBe('verified')
  })
  it('STATE 3 — verified + company_admin permission manages the company', () => {
    expect(companyInfoView({ membership: base({ permission_level: 'company_admin' }), viewerIsPlatformAdmin: false })).toBe('company_admin')
  })
  it('a company_admin permission on a PENDING relationship is still just pending', () => {
    expect(companyInfoView({ membership: base({ status: 'pending', permission_level: 'company_admin' }), viewerIsPlatformAdmin: false })).toBe('pending')
  })
  it('HeavyHaul admin always gets the management view; nobody connected gets none', () => {
    expect(companyInfoView({ membership: null, viewerIsPlatformAdmin: true })).toBe('company_admin')
    expect(companyInfoView({ membership: null, viewerIsPlatformAdmin: false })).toBe('none')
    expect(companyInfoView({ membership: base({ status: 'revoked' }), viewerIsPlatformAdmin: false })).toBe('revoked')
  })
})

describe('backend management gate (§25)', () => {
  const admin = base({ permission_level: 'company_admin' })
  it('verified company_admin of THIS company → yes', () => {
    expect(canManageCarrierCompany({ membership: admin, companyId: 'c1', viewerIsPlatformAdmin: false })).toBe(true)
  })
  it('wrong company, revoked, pending, or plain member → no', () => {
    expect(canManageCarrierCompany({ membership: admin, companyId: 'c2', viewerIsPlatformAdmin: false })).toBe(false)
    expect(canManageCarrierCompany({ membership: { ...admin, status: 'revoked' }, companyId: 'c1', viewerIsPlatformAdmin: false })).toBe(false)
    expect(canManageCarrierCompany({ membership: { ...admin, status: 'pending' }, companyId: 'c1', viewerIsPlatformAdmin: false })).toBe(false)
    expect(canManageCarrierCompany({ membership: base({}), companyId: 'c1', viewerIsPlatformAdmin: false })).toBe(false)
    expect(canManageCarrierCompany({ membership: null, companyId: 'c1', viewerIsPlatformAdmin: false })).toBe(false)
  })
  it('HeavyHaul admin → yes, even with no membership', () => {
    expect(canManageCarrierCompany({ membership: null, companyId: 'c1', viewerIsPlatformAdmin: true })).toBe(true)
  })
})

describe('relationship transitions', () => {
  it('approve/reject only from pending; revoke only from verified', () => {
    expect(membershipTransition('pending', 'approve')).toEqual({ ok: true, to: 'approved' })
    expect(membershipTransition('pending', 'reject')).toEqual({ ok: true, to: 'rejected' })
    expect(membershipTransition('approved', 'revoke')).toEqual({ ok: true, to: 'revoked' })
    expect(membershipTransition('revoked', 'approve').ok).toBe(false)
    expect(membershipTransition('approved', 'approve').ok).toBe(false)
    expect(membershipTransition('pending', 'revoke').ok).toBe(false)
    expect(membershipTransition('rejected', 'reject').ok).toBe(false)
  })
  it('reinstate: only from rejected or revoked, back to verified (Nash, 2026-09-22)', () => {
    expect(membershipTransition('rejected', 'reinstate')).toEqual({ ok: true, to: 'approved' })
    expect(membershipTransition('revoked', 'reinstate')).toEqual({ ok: true, to: 'approved' })
    expect(membershipTransition('approved', 'reinstate').ok).toBe(false)
    expect(membershipTransition('pending', 'reinstate').ok).toBe(false)
  })
})

describe('official vs editable fields', () => {
  it('a Company Admin may edit profile fields, never identity', () => {
    expect(isEditableCompanyField('display_name')).toBe(true)
    expect(isEditableCompanyField('operations_phone')).toBe(true)
    expect(isEditableCompanyField('mc_number')).toBe(false)
    expect(isEditableCompanyField('legal_name')).toBe(false)
    expect(isEditableCompanyField('corporate_email')).toBe(false)
  })
})

describe('header helpers', () => {
  it('badge and MC | USDOT line', () => {
    expect(carrierCompanyBadge({ verification_level: 2, verification_status: 'corporate_contact_confirmed' })).toEqual({ label: 'Verified Carrier', tone: 'ok' })
    expect(carrierCompanyBadge({ verification_level: 0, verification_status: 'unverified' }).label).toBe('Unverified Carrier')
    expect(mcDotLine({ mc_number: '123456', dot_number: '1234567' })).toBe('MC 123456 | USDOT 1234567')
    expect(mcDotLine({ mc_number: null, dot_number: '1' })).toBe('USDOT 1')
  })
})
