import { ColibriRemotionInputProps } from "../../schemas/manifest.js";
import { VIDEO_TEMPLATES, VideoTemplateSlug } from "../../schemas/templates.js";
import { resolveScenes } from "../shared/props.js";
import { sceneDurationFrames, totalSceneFrames } from "../shared/SceneLayers.js";
import { featureHighlightDurationFrames } from "./FeatureHighlight.js";
import { productDemoDurationFrames } from "./ProductDemo.js";
import { customerTestimonialDurationFrames } from "./CustomerTestimonial.js";
import { comparisonDurationFrames } from "./ComparisonBeforeAfter.js";

export function appLaunchTrailerDurationFrames(
  props: ColibriRemotionInputProps,
): number {
  const scenes = resolveScenes(props);
  const beatScenes = scenes.slice(0, 3);
  return (
    Math.round(props.fps * 4) +
    totalSceneFrames(beatScenes, props.fps) +
    Math.round(props.fps * 6)
  );
}

const durationCalculators: Record<
  VideoTemplateSlug,
  (props: ColibriRemotionInputProps) => number
> = {
  app_launch_trailer: appLaunchTrailerDurationFrames,
  feature_highlight: featureHighlightDurationFrames,
  product_demo: productDemoDurationFrames,
  customer_testimonial: customerTestimonialDurationFrames,
  comparison_before_after: comparisonDurationFrames,
};

export function calculateTemplateDurationInFrames(
  props: ColibriRemotionInputProps,
): number {
  const slug = props.templateSlug as VideoTemplateSlug;
  const calculator = durationCalculators[slug];

  if (calculator) {
    return calculator(props);
  }

  const fallbackOutro = VIDEO_TEMPLATES.feature_highlight.outroSeconds;
  const sceneFrames = props.scenes.reduce(
    (sum, scene) => sum + sceneDurationFrames(scene, props.fps),
    0,
  );

  return Math.max(
    sceneFrames + Math.round(fallbackOutro * props.fps),
    props.fps * 5,
  );
}
