import { EQBand, TrackEQ } from '../../studio/types';

// Default EQ bands with neutral settings
export const DEFAULT_EQ_BANDS: EQBand[] = [
  { type: 'highpass', enabled: true, frequency: 60, gain: 0, q: 0.707 },
  { type: 'lowshelf', enabled: true, frequency: 160, gain: 0, q: 0.707 },
  { type: 'peaking', enabled: true, frequency: 450, gain: 0, q: 0.707 },
  { type: 'peaking', enabled: true, frequency: 1200, gain: 0, q: 0.707 },
  { type: 'highshelf', enabled: true, frequency: 3200, gain: 0, q: 0.707 },
  { type: 'lowpass', enabled: true, frequency: 8800, gain: 0, q: 0.707 },
];

// Disabled variant of default EQ bands
export const DISABLED_EQ_BANDS: EQBand[] = DEFAULT_EQ_BANDS.map((x) => ({
  ...x,
  enabled: false,
}));

// Preset name constant for the flat/reset preset
export const FLAT_PRESET_NAME = 'Flat (Reset)';

// Helper function to deep compare two EQ settings
const eqEquals = (eq1: TrackEQ, eq2: TrackEQ): boolean => {
  // Skip comparing enabled state - we want to show the preset name even if EQ is disabled

  // Compare all 6 EQ bands
  const bandNames: Array<
    'band1' | 'band2' | 'band3' | 'band4' | 'band5' | 'band6'
  > = ['band1', 'band2', 'band3', 'band4', 'band5', 'band6'];

  for (const bandName of bandNames) {
    const band1 = eq1[bandName];
    const band2 = eq2[bandName];
    if (
      band1.type !== band2.type ||
      band1.enabled !== band2.enabled ||
      band1.frequency !== band2.frequency ||
      band1.gain !== band2.gain ||
      band1.q !== band2.q
    ) {
      return false;
    }
  }

  return true;
};

// Define EQ presets
export const EQ_PRESETS: Record<string, TrackEQ> = {
  [FLAT_PRESET_NAME]: {
    enabled: true,
    band1: DISABLED_EQ_BANDS[0],
    band2: DEFAULT_EQ_BANDS[1],
    band3: DEFAULT_EQ_BANDS[2],
    band4: DEFAULT_EQ_BANDS[3],
    band5: DEFAULT_EQ_BANDS[4],
    band6: DISABLED_EQ_BANDS[5],
  },

  'Hi-Pass': {
    enabled: true,
    band1: {
      type: 'highpass',
      enabled: true,
      frequency: 120,
      gain: 0,
      q: 0.707,
    },
    band2: DISABLED_EQ_BANDS[1],
    band3: DISABLED_EQ_BANDS[2],
    band4: DISABLED_EQ_BANDS[3],
    band5: DISABLED_EQ_BANDS[4],
    band6: DISABLED_EQ_BANDS[5],
  },

  Vocal: {
    enabled: true,
    band1: {
      type: 'highpass',
      enabled: true,
      frequency: 100,
      gain: 0,
      q: 0.707,
    },
    band2: DISABLED_EQ_BANDS[1],
    band3: {
      type: 'peaking',
      enabled: true,
      frequency: 400,
      gain: -2,
      q: 0.707,
    },
    band4: DISABLED_EQ_BANDS[3],
    band5: DISABLED_EQ_BANDS[4],
    band6: {
      type: 'highshelf',
      enabled: true,
      frequency: 6000,
      gain: 2,
      q: 0.25,
    },
  },

  Warm: {
    enabled: true,
    band1: {
      type: 'lowshelf',
      enabled: true,
      frequency: 200,
      gain: 2,
      q: 0.707,
    },
    band2: {
      type: 'peaking',
      enabled: true,
      frequency: 500,
      gain: 1,
      q: 0.707,
    },
    band3: DISABLED_EQ_BANDS[2],
    band4: {
      type: 'peaking',
      enabled: true,
      frequency: 3000,
      gain: -1,
      q: 0.707,
    },
    band5: DISABLED_EQ_BANDS[4],
    band6: {
      type: 'highshelf',
      enabled: true,
      frequency: 8000,
      gain: -2,
      q: 0.707,
    },
  },

  Bright: {
    enabled: true,
    band1: {
      type: 'highpass',
      enabled: true,
      frequency: 80,
      gain: 0,
      q: 0.707,
    },
    band2: {
      type: 'lowshelf',
      enabled: true,
      frequency: 250,
      gain: -1,
      q: 0.707,
    },
    band3: {
      type: 'peaking',
      enabled: true,
      frequency: 500,
      gain: -1,
      q: 0.707,
    },
    band4: {
      type: 'peaking',
      enabled: true,
      frequency: 3000,
      gain: 2,
      q: 0.707,
    },
    band5: DISABLED_EQ_BANDS[4],
    band6: {
      type: 'highshelf',
      enabled: true,
      frequency: 12000,
      gain: 3,
      q: 0.25,
    },
  },

  Presence: {
    enabled: true,
    band1: DISABLED_EQ_BANDS[0],
    band2: DISABLED_EQ_BANDS[1],
    band3: {
      type: 'peaking',
      enabled: true,
      frequency: 800,
      gain: -1,
      q: 0.707,
    },
    band4: { type: 'peaking', enabled: true, frequency: 3000, gain: 3, q: 0.5 },
    band5: DISABLED_EQ_BANDS[4],
    band6: {
      type: 'highshelf',
      enabled: true,
      frequency: 8000,
      gain: 1,
      q: 0.707,
    },
  },

  'Bass Boost': {
    enabled: true,
    band1: {
      type: 'lowshelf',
      enabled: true,
      frequency: 80,
      gain: 4,
      q: 0.707,
    },
    band2: {
      type: 'peaking',
      enabled: true,
      frequency: 200,
      gain: 2,
      q: 0.707,
    },
    band3: DISABLED_EQ_BANDS[2],
    band4: {
      type: 'peaking',
      enabled: true,
      frequency: 800,
      gain: -1,
      q: 0.707,
    },
    band5: DISABLED_EQ_BANDS[4],
    band6: DISABLED_EQ_BANDS[5],
  },

  Air: {
    enabled: true,
    band1: DISABLED_EQ_BANDS[0],
    band2: DISABLED_EQ_BANDS[1],
    band3: DISABLED_EQ_BANDS[2],
    band4: {
      type: 'peaking',
      enabled: true,
      frequency: 3000,
      gain: 1,
      q: 0.707,
    },
    band5: DISABLED_EQ_BANDS[4],
    band6: {
      type: 'highshelf',
      enabled: true,
      frequency: 10000,
      gain: 3,
      q: 0.5,
    },
  },

  Clarity: {
    enabled: true,
    band1: {
      type: 'lowshelf',
      enabled: true,
      frequency: 200,
      gain: -1,
      q: 0.707,
    },
    band2: {
      type: 'peaking',
      enabled: true,
      frequency: 600,
      gain: -2,
      q: 0.707,
    },
    band3: DISABLED_EQ_BANDS[2],
    band4: { type: 'peaking', enabled: true, frequency: 2500, gain: 2, q: 0.5 },
    band5: DISABLED_EQ_BANDS[4],
    band6: {
      type: 'highshelf',
      enabled: true,
      frequency: 8000,
      gain: 1,
      q: 0.707,
    },
  },

  Fullness: {
    enabled: true,
    band1: {
      type: 'lowshelf',
      enabled: true,
      frequency: 120,
      gain: 2,
      q: 0.707,
    },
    band2: {
      type: 'peaking',
      enabled: true,
      frequency: 400,
      gain: 1,
      q: 0.707,
    },
    band3: DISABLED_EQ_BANDS[2],
    band4: DISABLED_EQ_BANDS[3],
    band5: DISABLED_EQ_BANDS[4],
    band6: {
      type: 'highshelf',
      enabled: true,
      frequency: 8000,
      gain: 2,
      q: 0.707,
    },
  },

  'Lo-Fi': {
    enabled: true,
    band1: { type: 'highpass', enabled: true, frequency: 400, gain: 0, q: 1 },
    band2: DISABLED_EQ_BANDS[1],
    band3: { type: 'peaking', enabled: true, frequency: 1000, gain: 2, q: 0.5 },
    band4: { type: 'peaking', enabled: true, frequency: 2000, gain: 2, q: 0.5 },
    band5: DISABLED_EQ_BANDS[4],
    band6: { type: 'lowpass', enabled: true, frequency: 4000, gain: 0, q: 1 },
  },

  Modern: {
    enabled: true,
    band1: {
      type: 'lowshelf',
      enabled: true,
      frequency: 100,
      gain: 1,
      q: 0.707,
    },
    band2: {
      type: 'peaking',
      enabled: true,
      frequency: 500,
      gain: -1,
      q: 0.707,
    },
    band3: DISABLED_EQ_BANDS[2],
    band4: { type: 'peaking', enabled: true, frequency: 3000, gain: 2, q: 0.5 },
    band5: DISABLED_EQ_BANDS[4],
    band6: {
      type: 'highshelf',
      enabled: true,
      frequency: 10000,
      gain: 2,
      q: 0.5,
    },
  },
};

// Get the name of the current preset, or null if custom
export const getCurrentPresetName = (eq: TrackEQ): string | null => {
  for (const [name, preset] of Object.entries(EQ_PRESETS)) {
    if (eqEquals(eq, preset)) {
      return name;
    }
  }
  return null;
};
