import type { Metadata } from "next";
import { ListPlus } from "lucide-react";
import { PageHeader } from "@/components/shared/page-header";
import { MassOrderForm } from "@/components/panel/bulk/mass-order-form";
import { db } from "@/lib/db";
import { requireUser } from "@/lib/guards";
import { bulkTexts } from "@/lib/i18n/bulk";
import { userRate } from "@/lib/pricing";
import { dec } from "@/lib/serialize";
import { isMassOrderSupported, type MassOrderServiceDTO } from "@/lib/validation/bulk";

export const metadata: Metadata = { title: "Mass order" };

function hiddenServiceIds(value: unknown): number[] {
  if (!Array.isArray(value)) return [];
  return value.map((v) => Number(v)).filter((n) => Number.isInteger(n));
}

export default async function MassOrderPage() {
  const sessionUser = await requireUser();

  const account = await db.user.findUnique({
    where: { id: sessionUser.id },
    select: { id: true, balance: true, discountPercent: true, hiddenServices: true },
  });

  const balance = dec(account?.balance ?? 0);
  const discountPercent = account?.discountPercent ?? 0;
  const hidden = hiddenServiceIds(account?.hiddenServices);

  const [services, customRates] = await Promise.all([
    db.service.findMany({
      where: {
        active: true,
        ...(hidden.length ? { id: { notIn: hidden } } : {}),
      },
      select: {
        id: true,
        name: true,
        type: true,
        rate: true,
        min: true,
        max: true,
        increment: true,
        category: { select: { name: true } },
      },
      orderBy: { id: "asc" },
    }),
    db.userCustomRate.findMany({
      where: { userId: sessionUser.id },
      select: { serviceId: true, rate: true },
    }),
  ]);

  const customByService = new Map(
    customRates.map((c) => [c.serviceId, c.rate] as const),
  );

  const dtos: MassOrderServiceDTO[] = services.map((service) => ({
    id: service.id,
    name: service.name,
    categoryName: service.category?.name ?? "",
    type: service.type,
    rate: dec(
      userRate(service, { discountPercent }, customByService.get(service.id) ?? null),
    ),
    min: service.min,
    max: service.max,
    increment: service.increment,
    supported: isMassOrderSupported(service.type),
  }));

  return (
    <div className="mx-auto w-full max-w-screen-2xl p-4 sm:p-6">
      <PageHeader
        title={bulkTexts.massTitle}
        description={bulkTexts.massSubtitle}
        icon={ListPlus}
      />
      <MassOrderForm services={dtos} balance={balance} />
    </div>
  );
}
