import {
  getCurrentExcludeStyles,
  getCurrentStyles,
  getCurrentTitle,
  setCurrentExcludeStyles,
  setCurrentStyles,
  setCurrentTitle,
  setTimedCondition,
} from '@/app/(root)/create/v2/actions/currentModeSetters';
import { ConditionTypes, CreateFormState } from '@/app/(root)/create/v2/types';
import { combineActions } from '@/components/studio/actions/combineActions';
import { Clip } from '@/state/clipStore';
import { getClipTitle } from '@/utils/clip';

const getInitialBounds = (clip: Clip) => {
  const duration = clip.metadata.duration;
  if (!duration)
    return {
      startSeconds: 0,
      endSeconds: 0,
      contextStartSeconds: 0,
      contextEndSeconds: 0,
    };
  if (duration > 60)
    return {
      startSeconds: duration / 2 - 15,
      endSeconds: duration / 2 + 15,
      contextStartSeconds: duration / 2 - 30,
      contextEndSeconds: duration / 2 + 30,
    };
  if (duration > 30)
    return {
      startSeconds: duration / 2 - 5,
      endSeconds: duration / 2 + 5,
      contextStartSeconds: duration / 2 - 15,
      contextEndSeconds: duration / 2 + 15,
    };
  return {
    startSeconds: duration / 2,
    endSeconds: duration / 2,
    contextStartSeconds: 0,
    contextEndSeconds: duration,
  };
};

const infillClip = (clip: Clip) => (state: CreateFormState) => {
  const actions: ((state: CreateFormState) => CreateFormState)[] = [];

  if (!getCurrentStyles(state))
    actions.push(setCurrentStyles(clip.metadata?.tags || ''));

  if (!getCurrentExcludeStyles(state))
    actions.push(setCurrentExcludeStyles(clip.metadata?.negative_tags || ''));

  if (!getCurrentTitle(state))
    actions.push(setCurrentTitle(getClipTitle(clip) + ' (Section)'));

  actions.push(
    setTimedCondition({
      type: ConditionTypes.INFILL,
      condition: {
        clipId: clip.id,
        ...getInitialBounds(clip),
      },
    })
  );

  return combineActions(...actions)(state);
};

export default infillClip;
