import { prisma } from "@pmap/database";
import { getAdminSessionFromRequest } from "../../../../../auth";
import { fail, ok } from "../../../_lib";

async function listChapters() {
  return prisma.chapter.findMany({
    orderBy: { name: "asc" },
    select: { id: true, name: true }
  });
}

export async function GET(request: Request) {
  try {
    if (!await getAdminSessionFromRequest(request)) return fail(request, "UNAUTHORIZED", "Admin login is required.", 401);
    return ok(request, { chapters: await listChapters() });
  } catch (error) {
    return fail(request, "CHAPTERS_UNAVAILABLE", "Chapters could not be loaded.", 500, error instanceof Error ? error.message : error);
  }
}

export async function POST(request: Request) {
  try {
    if (!await getAdminSessionFromRequest(request)) return fail(request, "UNAUTHORIZED", "Admin login is required.", 401);
    const payload = await request.json() as { name?: string };
    const name = payload.name?.trim();
    if (!name) return fail(request, "CHAPTER_NAME_REQUIRED", "Chapter name is required.");
    await prisma.chapter.create({ data: { name } });
    return ok(request, { chapters: await listChapters() });
  } catch (error) {
    return fail(request, "CHAPTER_CREATE_FAILED", "Chapter could not be added.", 500, error instanceof Error ? error.message : error);
  }
}

export async function PATCH(request: Request) {
  try {
    if (!await getAdminSessionFromRequest(request)) return fail(request, "UNAUTHORIZED", "Admin login is required.", 401);
    const payload = await request.json() as { id?: string; name?: string };
    const name = payload.name?.trim();
    if (!payload.id || !name) return fail(request, "CHAPTER_UPDATE_INVALID", "Chapter id and name are required.");
    await prisma.chapter.update({ where: { id: payload.id }, data: { name } });
    return ok(request, { chapters: await listChapters() });
  } catch (error) {
    return fail(request, "CHAPTER_UPDATE_FAILED", "Chapter could not be updated.", 500, error instanceof Error ? error.message : error);
  }
}

export async function DELETE(request: Request) {
  try {
    if (!await getAdminSessionFromRequest(request)) return fail(request, "UNAUTHORIZED", "Admin login is required.", 401);
    const payload = await request.json() as { id?: string };
    if (!payload.id) return fail(request, "CHAPTER_ID_REQUIRED", "Chapter id is required.");
    const participantCount = await prisma.participantProfile.count({ where: { chapterId: payload.id } });
    if (participantCount > 0) {
      return fail(request, "CHAPTER_IN_USE", "This chapter is assigned to participants and cannot be deleted.", 409);
    }
    await prisma.chapter.delete({ where: { id: payload.id } });
    return ok(request, { chapters: await listChapters() });
  } catch (error) {
    return fail(request, "CHAPTER_DELETE_FAILED", "Chapter could not be deleted.", 500, error instanceof Error ? error.message : error);
  }
}
