import { z } from "zod";
import { ColibriRemotionInputProps } from "./manifest.js";

export const VIDEO_TEMPLATE_SLUGS = [
  "app_launch_trailer",
  "feature_highlight",
  "product_demo",
  "customer_testimonial",
  "comparison_before_after",
] as const;

export type VideoTemplateSlug = (typeof VIDEO_TEMPLATE_SLUGS)[number];

export type TemplateDefinition = {
  slug: VideoTemplateSlug;
  compositionId: string;
  thumbnailCompositionId: string;
  defaultDurationSeconds: number;
  outroSeconds: number;
  description: string;
};

export const VIDEO_TEMPLATES: Record<VideoTemplateSlug, TemplateDefinition> = {
  app_launch_trailer: {
    slug: "app_launch_trailer",
    compositionId: "AppLaunchTrailer",
    thumbnailCompositionId: "AppLaunchTrailerThumbnail",
    defaultDurationSeconds: 30,
    outroSeconds: 6,
    description: "High-energy launch trailer with product hero, three beats, and a strong CTA.",
  },
  feature_highlight: {
    slug: "feature_highlight",
    compositionId: "FeatureHighlight",
    thumbnailCompositionId: "FeatureHighlightThumbnail",
    defaultDurationSeconds: 15,
    outroSeconds: 2,
    description: "Single-feature spotlight with hook, demo moment, and payoff.",
  },
  product_demo: {
    slug: "product_demo",
    compositionId: "ProductDemo",
    thumbnailCompositionId: "ProductDemoThumbnail",
    defaultDurationSeconds: 60,
    outroSeconds: 0,
    description: "Guided walkthrough for imported screen recordings with VO and captions.",
  },
  customer_testimonial: {
    slug: "customer_testimonial",
    compositionId: "CustomerTestimonial",
    thumbnailCompositionId: "CustomerTestimonialThumbnail",
    defaultDurationSeconds: 30,
    outroSeconds: 4,
    description: "Quote-led story with customer proof points and brand outro.",
  },
  comparison_before_after: {
    slug: "comparison_before_after",
    compositionId: "ComparisonBeforeAfter",
    thumbnailCompositionId: "ComparisonBeforeAfterThumbnail",
    defaultDurationSeconds: 20,
    outroSeconds: 2,
    description: "Split narrative contrasting the old way vs your product.",
  },
};

export function isVideoTemplateSlug(slug: string): slug is VideoTemplateSlug {
  return VIDEO_TEMPLATE_SLUGS.includes(slug as VideoTemplateSlug);
}

export function resolveTemplateDefinition(templateSlug: string): TemplateDefinition {
  if (!isVideoTemplateSlug(templateSlug)) {
    throw new Error(`Unknown video template slug: ${templateSlug}`);
  }

  return VIDEO_TEMPLATES[templateSlug];
}

export function resolveCompositionId(templateSlug: string): string {
  return resolveTemplateDefinition(templateSlug).compositionId;
}

export function resolveThumbnailCompositionId(templateSlug: string): string {
  return resolveTemplateDefinition(templateSlug).thumbnailCompositionId;
}

export function calculateDurationInFrames(
  props: ColibriRemotionInputProps,
  outroSeconds: number,
): number {
  const sceneFrames = props.scenes.reduce(
    (sum, scene) => sum + Math.round((scene.duration_seconds ?? 5) * props.fps),
    0,
  );
  const outroFrames = Math.round(outroSeconds * props.fps);
  const minimum = props.fps * 5;

  return Math.max(sceneFrames + outroFrames, minimum);
}

export const templateSlugSchema = z.enum(VIDEO_TEMPLATE_SLUGS);
