import { describe, expect, it } from 'vitest';
import {
  buildTicketParticipantContext,
  resolveTicketParticipantKind,
  resolveTicketParticipantColor,
} from '@/features/tickets/utils/ticketParticipantContext';
import {
  getAgentColor,
  getCollaboratorColor,
  getCompanyAdminColor,
  getDepartmentHeadColor,
  getParticipantColor,
  getRequesterColor,
} from '@/features/tickets/utils/participantColors';

describe('ticketParticipantContext', () => {
  const context = buildTicketParticipantContext({
    requester: { id: 'req-1', name: 'Requester', email: 'req@test.com' },
    assignee: { id: 'assignee-1', name: 'Assignee', email: 'assignee@test.com' },
    collaborators: [
      {
        id: 'collab-1',
        user_id: 'collab-user',
        name: 'Collaborator',
        email: 'collab@test.com',
        role_names: ['agent_dept-1'],
        created_at: '2026-05-31T10:00:00Z',
      },
      {
        id: 'collab-2',
        user_id: 'head-user',
        name: 'Head',
        email: 'head@test.com',
        role_names: ['department_head'],
        created_at: '2026-05-31T10:00:00Z',
      },
      {
        id: 'collab-3',
        user_id: 'admin-user',
        name: 'Admin',
        email: 'admin@test.com',
        role_names: ['company_admin_abc'],
        created_at: '2026-05-31T10:00:00Z',
      },
    ],
  });

  it('builds collaborator maps from ticket data', () => {
    expect(context.collaboratorUserIds).toEqual(['collab-user', 'head-user', 'admin-user']);
    expect(context.collaboratorRolesByUserId?.['head-user']).toContain('department_head');
  });

  it('resolves participant kinds in priority order', () => {
    expect(resolveTicketParticipantKind('req-1', context)).toBe('requester');
    expect(resolveTicketParticipantKind('assignee-1', context)).toBe('assignee');
    expect(resolveTicketParticipantKind('admin-user', context)).toBe('company_admin');
    expect(resolveTicketParticipantKind('head-user', context)).toBe('department_head');
    expect(resolveTicketParticipantKind('collab-user', context)).toBe('collaborator');
    expect(resolveTicketParticipantKind('other-agent', context)).toBe('agent');
  });

  it('maps kinds to the correct fixed or hashed colors', () => {
    expect(resolveTicketParticipantColor('req-1', context, 'light')).toEqual(
      getRequesterColor('light'),
    );
    expect(resolveTicketParticipantColor('assignee-1', context, 'light')).toEqual(
      getAgentColor('light'),
    );
    expect(resolveTicketParticipantColor('admin-user', context, 'light')).toEqual(
      getCompanyAdminColor('light'),
    );
    expect(resolveTicketParticipantColor('head-user', context, 'light')).toEqual(
      getDepartmentHeadColor('light'),
    );
    expect(resolveTicketParticipantColor('collab-user', context, 'light')).toEqual(
      getCollaboratorColor('collab-user', 'light'),
    );
    expect(resolveTicketParticipantColor('other-agent', context, 'light')).toEqual(
      getParticipantColor('other-agent', undefined, 'light'),
    );
  });
});
