import type { ModelSchema } from "../../shared/types.js";
import { ensure } from "./errors.js";
import { photoInput } from "../../shared/video-input";
import { acceptsSdkParams, omitDisabledColorDepth } from "../../shared/sdk-video-options";
import { displayResolution } from "../../shared/video-options";
export function supportsProductVideo(s: ModelSchema) {
  const p = s.schema.properties;
  const quality = p.resolution ?? p.quality;
  return (
    !!(p.imageUrls || p.startFrame) &&
    !!p.duration &&
    (!quality || !!quality.enum?.some((v) =>
      typeof v === "string",
    )) &&
    (s.schema.required ?? []).every((k) =>
      [
        "prompt",
        "imageUrls",
        "startFrame",
        "duration",
        "resolution",
        "quality",
        "aspectRatio",
      ].includes(k),
    )
  );
}
export function videoParams(
  s: ModelSchema,
  input: {
    prompt: string;
    url: string;
    duration: number;
    resolution: string;
    aspectRatio: string;
    loop?: boolean;
  },
) {
  ensure(
    supportsProductVideo(s),
    "MODEL_SETTINGS",
    "Choose a model with supported product-photo controls.",
  );
  const p = s.schema.properties;
  const params: Record<string, unknown> = {};
  for (const [key, v] of Object.entries(p))
    if (v.default !== undefined) params[key] = v.default;
  const quality = p.resolution ? "resolution" : p.quality ? "quality" : undefined;
  if (quality) {
  const value = p[quality].enum?.find(
    (v) => displayResolution(v) === input.resolution,
  );
  ensure(
    value !== undefined,
    "RESOLUTION",
    "This model does not support that quality.",
  );
  params[quality] = value;
  }
  else ensure(input.resolution === '', 'RESOLUTION', 'This model controls its output resolution automatically.');
  delete params.aspectRatio;
  params.duration = p.duration.type === "string" ? String(input.duration) : input.duration;
  params.prompt = input.prompt;
  Object.assign(params, photoInput(s, input.url, input.loop));
  if (input.aspectRatio) {
    ensure(p.aspectRatio?.enum?.includes(input.aspectRatio), 'ASPECT_RATIO', 'This model does not support that aspect ratio.');
    params.aspectRatio = input.aspectRatio;
  }
  if (p.count) params.count = 1;
  if (p.generateAudio) params.generateAudio = false;
  if (p.enhancePrompt) params.enhancePrompt = false;
  if (p.promptExpansionMode?.enum?.includes("disabled"))
    params.promptExpansionMode = "disabled";
  omitDisabledColorDepth(s.model,params);
  ensure(acceptsSdkParams(s.model,params), 'PARAMETERS', 'These settings are not supported by the SDK for this photo input.');
  return params;
}
