import { AlignmentSpec } from '@/hooks/useGenerate';
import { Clip } from '@/state/clipStore';

import {
  EQ_PRESETS,
  FLAT_PRESET_NAME,
} from '../focusedObjectPanel/TrackEQSubsection/eqPresets';
import {
  DEFAULT_INSTRUMENT,
  StudioClip,
  StudioProjectState,
  StudioTrack,
} from './types';

export const createTestClip = (overrides: Partial<Clip> = {}): Clip => ({
  id: 'test-clip-1',
  status: 'complete',
  created_at: new Date().toISOString(),
  major_model_version: 'v1',
  model_name: 'test-model',
  title: 'Test Clip',
  is_handle_updated: false,
  is_liked: false,
  is_trashed: false,
  play_count: 0,
  upvote_count: 0,
  metadata: {
    tags: null,
    negative_tags: null,
    prompt: null,
    gpt_description_prompt: null,
    history: null,
    duration: 4,
  },
  ...overrides,
});

export const createTestStudioClip = (
  overrides: Partial<StudioClip> = {}
): StudioClip =>
  ({
    id: 'test-studio-clip-1',
    clipId: 'test-clip-1',
    uploadId: null,
    mute: false,
    name: 'Test Studio Clip',
    color: '#000000',
    transposition: 0,
    amplitude: 1,
    startBeats: 0,
    endBeats: 4,
    readStartBeats: 0,
    fadeInBeats: 0,
    fadeOutBeats: 0,
    loop: {
      enabled: false,
      startBeats: 0,
      endBeats: 0,
    },
    warp: {
      enabled: true,
      speed: 1,
      awaitingAnalysis: false,
      markers: {
        '0': 0,
        '1': 1,
      },
    },
    ...overrides,
  }) as StudioClip;

export const createTestTrack = (
  overrides: Partial<StudioTrack> = {}
): StudioTrack => ({
  id: 'test-track-1',
  name: 'Test Track',
  clips: [],
  color: '#000000',
  clipCreationIntents: [],
  height: 100,
  solo: false,
  mute: false,
  arm: false,
  input: null,
  amplitude: 1,
  balance: 0,
  instrument: DEFAULT_INSTRUMENT,
  soloTakeLaneId: null,
  takeLanesExpanded: false,
  takeLanes: [],
  eq: EQ_PRESETS[FLAT_PRESET_NAME],
  ...overrides,
});

export const createTestAlignmentSpec = (
  overrides: Partial<AlignmentSpec> = {}
): AlignmentSpec => ({
  historyClipId: undefined,
  historyEndSeconds: undefined,
  futureClipId: undefined,
  futureStartSeconds: undefined,
  ...overrides,
});

export const createTestProjectState = (
  overrides: Partial<StudioProjectState> = {}
): StudioProjectState => ({
  amplitude: 1,
  lyricsCorrectionsByClipId: {},
  tracks: [],
  selection: {
    focusedTrackId: null,
    focusedArea: 'timeline',
    focusBeats: 0,
    anchorBeats: 0,
    trackIds: [],
  },
  metronome: {
    enabled: false,
    amplitude: 1,
  },
  loop: {
    enabled: false,
    startBeats: 0,
    endBeats: 0,
  },
  timing: {
    type: 'manual',
    bps: 2,
    bpsAutomation: [],
  },
  songFadeInBeats: 0,
  songFadeOutBeats: 0,
  ...overrides,
});
