import { prisma } from "@/lib/prisma";
import { getAdminUser } from "@/lib/auth";
import { NextResponse } from "next/server";

const SUPPORT_US_PAGE_ID = BigInt(7);

const serializeBigInt = (data: any) =>
  JSON.parse(
    JSON.stringify(data, (_, value) =>
      typeof value === "bigint" ? value.toString() : value
    )
  );

// GET: list all sections for this page
export async function GET() {
  const admin = await getAdminUser();

  if (!admin) {
    return NextResponse.json(
      { success: false, message: "Unauthorized" },
      { status: 401 }
    );
  }

  try {
    const data = await prisma.cms_support_us_sections.findMany({
      where: { page_id: SUPPORT_US_PAGE_ID },
      orderBy: [{ sort_order: "asc" }, { id: "asc" }],
    });

    return NextResponse.json({ success: true, data: serializeBigInt(data) });
  } catch (error: any) {
    return NextResponse.json(
      { success: false, message: error.message || "Failed to fetch data" },
      { status: 500 }
    );
  }
}

// POST: create a section
export async function POST(req: Request) {
  const admin = await getAdminUser();

  if (!admin) {
    return NextResponse.json(
      { success: false, message: "Unauthorized" },
      { status: 401 }
    );
  }

  try {
    const body = await req.json();

    const pageExists = await prisma.cms_pages.findUnique({
      where: { id: SUPPORT_US_PAGE_ID },
    });

    if (!pageExists) {
      return NextResponse.json(
        { success: false, message: "Support Us page does not exist in cms_pages" },
        { status: 400 }
      );
    }

    const title = String(body.title || "").trim();

    if (!title) {
      return NextResponse.json(
        { success: false, message: "Title is required" },
        { status: 400 }
      );
    }

    const item = await prisma.cms_support_us_sections.create({
      data: {
        page_id: SUPPORT_US_PAGE_ID,
        title,
        html_content: String(body.html_content || ""),
        sort_order: Number(body.sort_order) || 0,
        status: Boolean(body.status),
      },
    });

    return NextResponse.json({ success: true, data: serializeBigInt(item) });
  } catch (error: any) {
    return NextResponse.json(
      { success: false, message: error.message || "Failed to create record" },
      { status: 500 }
    );
  }
}

// PUT: update a section
export async function PUT(req: Request) {
  const admin = await getAdminUser();

  if (!admin) {
    return NextResponse.json(
      { success: false, message: "Unauthorized" },
      { status: 401 }
    );
  }

  try {
    const body = await req.json();
    const id = BigInt(String(body.id));

    const existing = await prisma.cms_support_us_sections.findUnique({ where: { id } });

    if (!existing) {
      return NextResponse.json(
        { success: false, message: "Record not found" },
        { status: 404 }
      );
    }

    const title = String(body.title || "").trim();

    if (!title) {
      return NextResponse.json(
        { success: false, message: "Title is required" },
        { status: 400 }
      );
    }

    const item = await prisma.cms_support_us_sections.update({
      where: { id },
      data: {
        title,
        html_content: String(body.html_content || ""),
        sort_order: Number(body.sort_order) || 0,
        status: Boolean(body.status),
        updated_at: new Date(),
      },
    });

    return NextResponse.json({ success: true, data: serializeBigInt(item) });
  } catch (error: any) {
    return NextResponse.json(
      { success: false, message: error.message || "Failed to update record" },
      { status: 500 }
    );
  }
}

// DELETE: remove a section (?id=)
export async function DELETE(req: Request) {
  const admin = await getAdminUser();

  if (!admin) {
    return NextResponse.json(
      { success: false, message: "Unauthorized" },
      { status: 401 }
    );
  }

  try {
    const { searchParams } = new URL(req.url);
    const idParam = searchParams.get("id");

    if (!idParam) {
      return NextResponse.json(
        { success: false, message: "id is required" },
        { status: 400 }
      );
    }

    await prisma.cms_support_us_sections.delete({
      where: { id: BigInt(idParam) },
    });

    return NextResponse.json({ success: true });
  } catch (error: any) {
    return NextResponse.json(
      { success: false, message: error.message || "Failed to delete record" },
      { status: 500 }
    );
  }
}