/** Open-source YouTube Shorts pipeline — zero per-video API cost (self-hosted GPU). */

export interface StoryboardScene {
  scene: number;
  duration: number;
  visual_prompt: string;
  voiceover: string;
  text: string;
  camera: string;
  motion: string;
  transition: string;
  animation?: string;
  sound_effect?: string;
}

export interface VideoStoryboard {
  title: string;
  creative_concept: string;
  total_duration_seconds: number;
  visual_direction: string;
  music_style: string;
  scenes: StoryboardScene[];
  cta: {
    text: string;
    website?: string;
    phone?: string;
    email?: string;
  };
}

export function parseStoryboardJson(raw: string): VideoStoryboard | null {
  const match = raw.match(/\{[\s\S]*\}/);
  if (!match) return null;
  try {
    const data = JSON.parse(match[0]) as Partial<VideoStoryboard>;
    if (!data.scenes?.length || !data.title) return null;
    return {
      title: String(data.title),
      creative_concept: String(data.creative_concept ?? ""),
      total_duration_seconds: Number(data.total_duration_seconds ?? 30),
      visual_direction: String(data.visual_direction ?? ""),
      music_style: String(data.music_style ?? "Royalty-free corporate"),
      scenes: data.scenes.map((s, i) => ({
        scene: Number(s.scene ?? i + 1),
        duration: Number(s.duration ?? 3),
        visual_prompt: String(s.visual_prompt ?? ""),
        voiceover: String(s.voiceover ?? ""),
        text: String(s.text ?? ""),
        camera: String(s.camera ?? "Medium shot"),
        motion: String(s.motion ?? "Slow push in"),
        transition: String(s.transition ?? "Cross dissolve"),
        animation: s.animation ? String(s.animation) : undefined,
        sound_effect: s.sound_effect ? String(s.sound_effect) : undefined,
      })),
      cta: {
        text: String(data.cta?.text ?? "Learn more"),
        website: data.cta?.website,
        phone: data.cta?.phone,
        email: data.cta?.email,
      },
    };
  } catch {
    return null;
  }
}
