import { generateObject } from "ai";
import { z } from "zod";
import { resolveModel, type AiConfig } from "../factory";
import { dietaryTagsSchema, ingredientSchema, stepSchema } from "./recipe-schema";

const ImportedRecipeSchema = z.object({
  title: z.string(),
  description: z.string().optional(),
  baseServings: z.number().int().min(1).optional(),
  prepMins: z.number().int().min(0).optional(),
  cookMins: z.number().int().min(0).optional(),
  difficulty: z.enum(["easy", "medium", "hard"]).optional(),
  dietaryTags: dietaryTagsSchema.optional(),
  ingredients: z.array(ingredientSchema(z.string())),
  steps: z.array(stepSchema),
});

export type ImportedRecipe = z.infer<typeof ImportedRecipeSchema>;

export async function importFromPhoto(
  imageBase64: string,
  mimeType: "image/jpeg" | "image/png" | "image/webp",
  config?: AiConfig,
  _locale?: string,
): Promise<ImportedRecipe> {
  const model = resolveModel(config);

  const { object } = await generateObject({
    model,
    schema: ImportedRecipeSchema,
    system:
      "You are a recipe extraction specialist. Extract the complete recipe from the provided image. Be precise with ingredient quantities and cooking instructions.",
    messages: [
      {
        role: "user",
        content: [
          { type: "image", image: imageBase64, mediaType: mimeType },
          { type: "text", text: "Extract the complete recipe from this image." },
        ],
      },
    ],
  });

  return object;
}
