import { setIn } from 'lodash-redux-immutability';

import {
  ConditionTypes,
  CreateFormState,
  CreateModes,
} from '@/app/(root)/create/v2/types';
import { Clip } from '@/state/clipStore';
import { getClipTitle } from '@/utils/clip';

const getInitialStartSeconds = (clip: Clip) => {
  const duration = clip.metadata.duration;
  if (!duration) return 0;
  return Math.floor(duration * 0.7);
};

const extendClip =
  (clip: Clip, options?: { overwriteStyles?: boolean }) =>
  (state: CreateFormState) => {
    state = setIn(
      state,
      ['global', 'mode'],
      [CreateModes.CUSTOM, CreateModes.CHAT].includes(state.global.mode)
        ? state.global.mode
        : CreateModes.CUSTOM
    );

    const oldConfig = state[CreateModes.CUSTOM];
    const newConfig = {
      ...oldConfig,
      styles:
        options?.overwriteStyles === true
          ? clip.metadata?.tags || ''
          : options?.overwriteStyles === false
            ? oldConfig.styles
            : oldConfig.styles || clip.metadata?.tags || '',
      excludeStyles:
        options?.overwriteStyles === true
          ? clip.metadata?.negative_tags || ''
          : options?.overwriteStyles === false
            ? oldConfig.excludeStyles
            : oldConfig.excludeStyles || clip.metadata?.negative_tags || '',
      // Do NOT overwrite lyrics (keep current)
      title: getClipTitle(clip) + ' (Extend)',
    };

    state = setIn(state, [CreateModes.CUSTOM], newConfig);

    // Clear any existing inspiration when adding extend
    const {
      [ConditionTypes.COVER]: cover,
      [ConditionTypes.PLAYLIST]: playlist,
      [ConditionTypes.INSPIRATION]: inspiration,
      ...otherUntimedConditions
    } = state.global.untimedConditions;
    state = setIn(
      state,
      ['global', 'untimedConditions'],
      otherUntimedConditions
    );

    // Set the extend condition
    state = setIn(state, ['global', 'timedCondition'], {
      type: ConditionTypes.EXTEND,
      condition: {
        clipId: clip.id,
        startSeconds: getInitialStartSeconds(clip),
      },
    });

    return state;
  };

export default extendClip;
