"use server";

import { revalidatePath } from "next/cache";
import { api } from "../../../convex/_generated/api";
import { m } from "@/lib/convex-server";
import { run, type ActionResult } from "@/lib/action";

const rev = (apartmentId?: string) => {
  revalidatePath("/apartments");
  revalidatePath("/login");
  if (apartmentId) revalidatePath(`/apartments/${apartmentId}`);
};

export async function getImageUploadUrl(): Promise<ActionResult<{ url: string }>> {
  return run(async () => ({ url: await m(api.media.generateUploadUrl, {}) }));
}

export async function registerImage(input: { apartmentId: string; storageId: string; mimeType: string; size: number; fileName?: string; category?: string; caption?: string | null; width?: number; height?: number }): Promise<ActionResult<{ id: string; url: string }>> {
  return run(async () => {
    const r = await m(api.media.register, input);
    rev(input.apartmentId);
    return { id: r.id, url: `/api/media/${r.id}` };
  });
}

export async function updateImage(id: string, input: { caption?: string | null; category?: string }): Promise<ActionResult<undefined>> {
  return run(async () => {
    await m(api.media.update, { id, ...input });
    rev();
    return undefined;
  });
}

export async function setCoverImage(id: string): Promise<ActionResult<undefined>> {
  return run(async () => {
    await m(api.media.setCover, { id });
    rev();
    return undefined;
  });
}

export async function reorderImages(apartmentId: string, orderedIds: string[]): Promise<ActionResult<undefined>> {
  return run(async () => {
    await m(api.media.reorder, { apartmentId, orderedIds });
    rev(apartmentId);
    return undefined;
  });
}

export async function archiveImage(id: string, archived: boolean): Promise<ActionResult<undefined>> {
  return run(async () => {
    await m(api.media.archive, { id, archived });
    rev();
    return undefined;
  });
}

export async function deleteImage(id: string, reason?: string): Promise<ActionResult<undefined>> {
  return run(async () => {
    await m(api.media.remove, { id, reason });
    rev();
    return undefined;
  });
}
