import { describe, expect, it } from 'vitest';

import fixSelection from './fixSelection';

describe('fixSelection', () => {
  it('should return defaults for null/undefined', () => {
    const result = fixSelection(null);
    expect(result.anchorBeats).toBe(0);
    expect(result.focusBeats).toBe(0);
    expect(result.trackIds).toEqual([]);
    expect(result.focusedTrackId).toBe(null);
    expect(result.focusedArea).toBe(null);
  });

  it('should fix selection in place', () => {
    const input = {
      anchorBeats: 4,
      focusBeats: 8,
      trackIds: ['track1', 'track2'],
      focusedTrackId: 'track1',
      focusedArea: 'tracks' as const,
    };

    const result = fixSelection(input);

    expect(result).toBe(input); // Referential equality
    expect(result.anchorBeats).toBe(4);
    expect(result.focusBeats).toBe(8);
    expect(result.trackIds).toEqual(['track1', 'track2']);
    expect(result.focusedTrackId).toBe('track1');
    expect(result.focusedArea).toBe('tracks');
  });

  it('should migrate from old startBeats/endBeats', () => {
    const input = {
      startBeats: 2,
      endBeats: 6,
      trackIds: [],
      focusedTrackId: null,
      focusedArea: null,
    };

    const result = fixSelection(input);

    expect(result.anchorBeats).toBe(2);
    expect(result.focusBeats).toBe(6);
  });

  it('should prefer new field names over old', () => {
    const input = {
      anchorBeats: 10,
      focusBeats: 20,
      startBeats: 2,
      endBeats: 6,
      trackIds: [],
      focusedTrackId: null,
      focusedArea: null,
    };

    const result = fixSelection(input);

    expect(result.anchorBeats).toBe(10);
    expect(result.focusBeats).toBe(20);
  });

  it('should filter non-string trackIds', () => {
    const input = {
      anchorBeats: 0,
      focusBeats: 0,
      trackIds: ['track1', 123, null, 'track2', undefined],
      focusedTrackId: null,
      focusedArea: null,
    };

    const result = fixSelection(input);

    expect(result.trackIds).toEqual(['track1', 'track2']);
  });

  it('should validate focusedArea values', () => {
    expect(fixSelection({ focusedArea: 'tracks' }).focusedArea).toBe('tracks');
    expect(fixSelection({ focusedArea: 'timeline' }).focusedArea).toBe(
      'timeline'
    );
    expect(fixSelection({ focusedArea: 'invalid' }).focusedArea).toBe(null);
    expect(fixSelection({ focusedArea: null }).focusedArea).toBe(null);
  });
});
