"use server";
import { prisma } from "@/lib/prisma";
import { revalidatePath } from "next/cache";

export async function getMediaFolders() {
  try {
    const folders = await prisma.mediaFolder.findMany({
      orderBy: { createdAt: "asc" },
      include: {
        _count: { select: { medias: { where: { isActive: true } } } }
      }
    });
    return { success: true, folders };
  } catch (err: any) {
    console.error("Error fetching folders:", err);
    return { success: false, error: err.message };
  }
}

export async function createMediaFolder(name: string, parentId?: string) {
  try {
    const folder = await prisma.mediaFolder.create({
      data: { name, parentId: parentId || null },
    });
    revalidatePath("/admin/media");
    return { success: true, folder };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}

export async function deleteMediaFolder(id: string) {
  try {
    // Delete folder and detach its media (set folderId to null)
    await prisma.media.updateMany({
      where: { folderId: id },
      data: { folderId: null }
    });
    
    await prisma.mediaFolder.delete({
      where: { id }
    });
    revalidatePath("/admin/media");
    return { success: true };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}

export async function getMedia(folderId?: string | null) {
  try {
    const whereClause: any = { isActive: true, url: { not: { startsWith: "/flags/" } } };
    
    // If folderId is passed, filter by it. If null, return root media. If undefined, return all.
    if (folderId !== undefined) {
      whereClause.folderId = folderId;
    }
    
    const media = await prisma.media.findMany({
      where: whereClause,
      orderBy: { createdAt: "desc" },
    });
    return media;
  } catch { return []; }
}

export async function moveMediaToFolder(mediaIds: string[], folderId: string | null) {
  try {
    await prisma.media.updateMany({
      where: { id: { in: mediaIds } },
      data: { folderId }
    });
    revalidatePath("/admin/media");
    return { success: true };
  } catch (err: any) {
    return { success: false, error: err.message };
  }
}

export async function deleteMedia(id: string) {
  try {
    await prisma.media.update({ where: { id }, data: { isActive: false } });
    revalidatePath("/admin/media");
    return { success: true };
  } catch (e: any) {
    return { success: false, error: e.message };
  }
}

export async function updateMediaAlt(id: string, alt: string) {
  try {
    await prisma.media.update({ where: { id }, data: { alt } });
    revalidatePath("/admin/media");
    return { success: true };
  } catch (e: any) {
    return { success: false, error: e.message };
  }
}
