import type { Metadata } from "next";
import { notFound } from "next/navigation";
import { headers } from "next/headers";
import { auth } from "@/lib/auth/server";
import { db, recipes } from "@epicure/db";
import { and, eq } from "@epicure/db";
import { RecipeForm } from "@/components/recipe/recipe-form";
import { getPublicUrl } from "@/lib/storage";
import { getMessages } from "@/lib/i18n/server";

type Params = { params: Promise<{ id: string }> };

export const metadata: Metadata = {};

export default async function EditRecipePage({ params }: Params) {
  const { id } = await params;
  const session = await auth.api.getSession({ headers: await headers() });
  if (!session) return null;

  const recipe = await db.query.recipes.findFirst({
    where: and(eq(recipes.id, id), eq(recipes.authorId, session.user.id)),
    with: {
      ingredients: { orderBy: (t, { asc }) => asc(t.order) },
      steps: { orderBy: (t, { asc }) => asc(t.order) },
      photos: { orderBy: (t, { asc }) => asc(t.order) },
      batchDishes: { orderBy: (t, { asc }) => asc(t.order) },
    },
  });

  if (!recipe) notFound();

  const m = getMessages((session.user as { locale?: string }).locale);

  const defaultValues = {
    title: recipe.title,
    description: recipe.description ?? undefined,
    baseServings: recipe.baseServings,
    visibility: recipe.visibility,
    difficulty: recipe.difficulty,
    prepMins: recipe.prepMins,
    cookMins: recipe.cookMins,
    tags: recipe.tags ?? [],
    dietaryTags: (recipe.dietaryTags as Record<string, boolean | undefined>) ?? {},
    ingredients: recipe.ingredients.map((ing) => ({
      id: ing.id,
      rawName: ing.rawName,
      quantity: ing.quantity ?? "",
      unit: ing.unit ?? "",
      note: ing.note ?? "",
    })),
    steps: recipe.steps.map((step) => ({
      id: step.id,
      instruction: step.instruction,
      timerSeconds: step.timerSeconds ? String(step.timerSeconds) : "",
      appliesTo: step.appliesTo ?? [],
    })),
    photos: recipe.photos.map((photo) => ({
      key: photo.storageKey,
      isCover: photo.isCover,
      preview: getPublicUrl(photo.storageKey),
    })),
    isBatchCook: recipe.isBatchCook,
    dishes: recipe.batchDishes.map((dish) => ({
      id: dish.id,
      name: dish.name,
      description: dish.description ?? "",
      fridgeDays: String(dish.fridgeDays),
      freezerFriendly: dish.freezerFriendly,
      freezerNote: dish.freezerNote ?? "",
      dayOfInstructions: dish.dayOfInstructions,
    })),
  };

  return (
    <div className="space-y-6">
      <div>
        <h1 className="text-3xl font-bold tracking-tight">{m.recipes.editTitle}</h1>
        <p className="text-muted-foreground mt-1">{recipe.title}</p>
      </div>
      <RecipeForm recipeId={id} defaultValues={defaultValues} />
    </div>
  );
}
