import { auth } from "@/lib/auth";
import { db } from "@/lib/db";
import { AVERY_SPECS } from "@/lib/avery-specs";
import { SheetBuilderClient } from "./SheetBuilderClient";
import type { PickerFolder, PickerLabel } from "./LabelPickerModal";

function chunkIntoPages(labels: PickerLabel[], perSheet: number): (PickerLabel | null)[][] {
  const chunks: (PickerLabel | null)[][] = [];
  for (let i = 0; i < labels.length; i += perSheet) {
    const chunk: (PickerLabel | null)[] = labels.slice(i, i + perSheet);
    while (chunk.length < perSheet) chunk.push(null);
    chunks.push(chunk);
  }
  return chunks;
}

export default async function SheetBuilderPage({
  searchParams,
}: {
  searchParams: Promise<{ folder?: string; label?: string; labels?: string }>;
}) {
  const session = await auth();
  const userId = (session?.user as { id?: string } | undefined)?.id as string;
  const { folder: seedFolderId, label: seedLabelId, labels: seedLabelIds } =
    await searchParams;

  const rawFolders = await db.savedFolder.findMany({
    where: { userId },
    orderBy: { name: "asc" },
    include: {
      labels: {
        include: {
          label: {
            include: {
              blend: { include: { brand: true } },
              uploader: true,
              versions: { where: { isCurrent: true }, take: 1 },
            },
          },
        },
      },
    },
  });

  const folders: PickerFolder[] = rawFolders.map((folder) => ({
    id: folder.id,
    name: folder.name,
    labels: folder.labels
      .map((saved) => saved.label)
      .filter((label) => label.versions[0])
      .map((label) => ({
        id: label.id,
        fileUrl: label.versions[0].fileUrl,
        brandName: label.blend.brand.name,
        blendName: label.blend.name,
        uploaderUsername: label.uploader.username,
      })),
  }));

  // "Print this folder" entry point (from the profile folder view) --
  // auto-spills the folder's labels across as many sheets as needed rather
  // than truncating, per the Backlog design note.
  let initialPages: (PickerLabel | null)[][] | null = null;
  const seedFolder = seedFolderId
    ? folders.find((f) => f.id === seedFolderId)
    : undefined;
  if (seedFolder && seedFolder.labels.length > 0) {
    initialPages = chunkIntoPages(seedFolder.labels, AVERY_SPECS.wide.labelsPerSheet);
  }

  // "Add to Sheet" entry point from the label detail page -- seeds a fresh
  // sheet with just that one label in the first slot.
  let seedLabel: PickerLabel | null = null;
  if (!seedFolder && seedLabelId) {
    const label = await db.label.findUnique({
      where: { id: seedLabelId },
      include: {
        blend: { include: { brand: true } },
        uploader: true,
        versions: { where: { isCurrent: true }, take: 1 },
      },
    });
    if (label?.versions[0]) {
      seedLabel = {
        id: label.id,
        fileUrl: label.versions[0].fileUrl,
        brandName: label.blend.brand.name,
        blendName: label.blend.name,
        uploaderUsername: label.uploader.username,
      };
      const page: (PickerLabel | null)[] = new Array(AVERY_SPECS.wide.labelsPerSheet).fill(
        null,
      );
      page[0] = seedLabel;
      initialPages = [page];
    }
  }

  // "Select from folder" entry point -- a specific subset of labels chosen
  // on the profile's folder view, same auto-spill chunking as the
  // print-whole-folder flow.
  let seedLabelCount = 0;
  if (!seedFolder && !seedLabelId && seedLabelIds) {
    const ids = seedLabelIds.split(",").filter(Boolean);
    if (ids.length > 0) {
      const labels = await db.label.findMany({
        where: { id: { in: ids } },
        include: {
          blend: { include: { brand: true } },
          uploader: true,
          versions: { where: { isCurrent: true }, take: 1 },
        },
      });
      const pickerLabels: PickerLabel[] = labels
        .filter((label) => label.versions[0])
        .map((label) => ({
          id: label.id,
          fileUrl: label.versions[0].fileUrl,
          brandName: label.blend.brand.name,
          blendName: label.blend.name,
          uploaderUsername: label.uploader.username,
        }));
      if (pickerLabels.length > 0) {
        initialPages = chunkIntoPages(pickerLabels, AVERY_SPECS.wide.labelsPerSheet);
        seedLabelCount = pickerLabels.length;
      }
    }
  }

  return (
    <div>
      <h1 className="font-heading text-3xl font-semibold text-terracotta">
        Sheet Builder
      </h1>
      <p className="mt-2 text-charcoal/60">
        Compose a print-ready sheet of labels for your Avery jar lids.
        {seedFolder &&
          ` Seeded with ${seedFolder.labels.length} label${seedFolder.labels.length === 1 ? "" : "s"} from "${seedFolder.name}".`}
        {seedLabel && ` Added ${seedLabel.brandName} - ${seedLabel.blendName} to a new sheet.`}
        {seedLabelCount > 0 &&
          ` Seeded with ${seedLabelCount} selected label${seedLabelCount === 1 ? "" : "s"}.`}
      </p>

      <div className="mt-8">
        <SheetBuilderClient
          folders={folders}
          initialJarType="wide"
          initialPages={initialPages}
        />
      </div>
    </div>
  );
}
