import { describe, it, expect } from 'vitest';
import { PIPELINE_STAGES, BERTH_STATUSES, NOTIFICATION_TYPES } from '@/lib/constants';

describe('PIPELINE_STAGES', () => {
  it('has exactly 7 entries', () => {
    expect(PIPELINE_STAGES).toHaveLength(7);
  });

  it('starts with "enquiry"', () => {
    expect(PIPELINE_STAGES[0]).toBe('enquiry');
  });

  it('ends with "contract"', () => {
    expect(PIPELINE_STAGES[PIPELINE_STAGES.length - 1]).toBe('contract');
  });

  it('contains all expected stages in order', () => {
    expect(PIPELINE_STAGES).toEqual([
      'enquiry',
      'qualified',
      'nurturing',
      'eoi',
      'reservation',
      'deposit_paid',
      'contract',
    ]);
  });

  it('is a readonly tuple - type-level immutability via `as const`', () => {
    const arr = PIPELINE_STAGES as unknown as string[];
    expect(arr).toHaveLength(7);
  });

  it('has no duplicate entries', () => {
    const unique = new Set(PIPELINE_STAGES);
    expect(unique.size).toBe(PIPELINE_STAGES.length);
  });
});

describe('BERTH_STATUSES', () => {
  it('has exactly 3 entries', () => {
    expect(BERTH_STATUSES).toHaveLength(3);
  });

  it('contains "available"', () => {
    expect(BERTH_STATUSES).toContain('available');
  });

  it('contains "under_offer"', () => {
    expect(BERTH_STATUSES).toContain('under_offer');
  });

  it('contains "sold"', () => {
    expect(BERTH_STATUSES).toContain('sold');
  });

  it('has no duplicate entries', () => {
    const unique = new Set(BERTH_STATUSES);
    expect(unique.size).toBe(BERTH_STATUSES.length);
  });
});

describe('NOTIFICATION_TYPES', () => {
  it('contains "interest_stage_changed"', () => {
    expect(NOTIFICATION_TYPES).toContain('interest_stage_changed');
  });

  it('contains "mention"', () => {
    expect(NOTIFICATION_TYPES).toContain('mention');
  });

  it('contains "email_received"', () => {
    expect(NOTIFICATION_TYPES).toContain('email_received');
  });

  it('has no duplicate entries', () => {
    const unique = new Set(NOTIFICATION_TYPES);
    expect(unique.size).toBe(NOTIFICATION_TYPES.length);
  });

  it('contains expected notification categories (interest, document, reminder, financial, email, system)', () => {
    const types = new Set(NOTIFICATION_TYPES);
    // Interest
    expect(types.has('interest_stage_changed')).toBe(true);
    expect(types.has('interest_created')).toBe(true);
    // Document
    expect(types.has('document_sent')).toBe(true);
    expect(types.has('document_signed')).toBe(true);
    // Financial
    expect(types.has('invoice_paid')).toBe(true);
    // System
    expect(types.has('system_alert')).toBe(true);
  });
});
