import { createServerFn } from "@tanstack/react-start";
import { z } from "zod";
import { requireSupabaseAuth } from "@/integrations/supabase/auth-middleware";

const SLOTS = ["lighting", "wardrobe", "pose", "environment"] as const;

const SaveSchema = z.object({
  photoshootId: z.string().uuid(),
  slot: z.enum(SLOTS),
  // base64 PNG (no data URL prefix), capped ~3MB encoded
  imageB64: z.string().min(100).max(4_500_000),
});

export type MoodboardSlot = (typeof SLOTS)[number];
export type MoodboardImages = Partial<Record<MoodboardSlot, string>>;

export const saveMoodboardImage = createServerFn({ method: "POST" })
  .middleware([requireSupabaseAuth])
  .inputValidator((d: unknown) => SaveSchema.parse(d))
  .handler(async ({ data, context }) => {
    const { data: row, error: readErr } = await context.supabase
      .from("photoshoots")
      .select("moodboard_images")
      .eq("id", data.photoshootId)
      .single();
    if (readErr) throw new Error(readErr.message);
    const current: MoodboardImages = (row?.moodboard_images as MoodboardImages | null) ?? {};
    const next: MoodboardImages = { ...current, [data.slot]: data.imageB64 };
    const { error } = await context.supabase
      .from("photoshoots")
      .update({ moodboard_images: next as never })
      .eq("id", data.photoshootId);
    if (error) throw new Error(error.message);
    return { ok: true };
  });

export const clearMoodboardImage = createServerFn({ method: "POST" })
  .middleware([requireSupabaseAuth])
  .inputValidator((d: unknown) => z.object({ photoshootId: z.string().uuid(), slot: z.enum(SLOTS) }).parse(d))
  .handler(async ({ data, context }) => {
    const { data: row } = await context.supabase
      .from("photoshoots")
      .select("moodboard_images")
      .eq("id", data.photoshootId)
      .single();
    const current: MoodboardImages = (row?.moodboard_images as MoodboardImages | null) ?? {};
    const next = { ...current };
    delete next[data.slot];
    const { error } = await context.supabase
      .from("photoshoots")
      .update({ moodboard_images: Object.keys(next).length ? (next as never) : null })
      .eq("id", data.photoshootId);
    if (error) throw new Error(error.message);
    return { ok: true };
  });
