import type { Metadata } from "next";
import { Prisma } from "@prisma/client";
import { Info, Share2 } from "lucide-react";
import { PageHeader } from "@/components/shared/page-header";
import { AffiliateStats } from "@/components/panel/affiliates/affiliate-stats";
import { AffiliateHowItWorks } from "@/components/panel/affiliates/how-it-works";
import { PayoutHistory, type PayoutRowDTO } from "@/components/panel/affiliates/payout-history";
import { PayoutRequestForm } from "@/components/panel/affiliates/payout-request-form";
import { ReferralLinkCard } from "@/components/panel/affiliates/referral-link-card";
import { db } from "@/lib/db";
import { requireUser } from "@/lib/guards";
import { formatNumber } from "@/lib/format";
import { dec, iso, money } from "@/lib/serialize";
import { getGeneralSettings, getModuleSettings } from "@/lib/settings";
import { affiliatesTexts } from "@/lib/i18n/affiliates";

export const dynamic = "force-dynamic";

export const metadata: Metadata = {
  title: "Affiliates — SMM Panel",
};

function appUrl(): string {
  return (process.env.APP_URL ?? "http://localhost:3000").replace(/\/+$/, "");
}

function conversionRate(registrations: number, visits: number): string {
  if (visits <= 0) return "0%";
  const pct = (registrations / visits) * 100;
  const rounded = Math.round(pct * 10) / 10;
  return `${formatNumber(rounded, 1)}%`;
}

export default async function AffiliatesPage() {
  const user = await requireUser();

  const [dbUser, modules, general] = await Promise.all([
    db.user.findUnique({ where: { id: user.id }, select: { refCode: true } }),
    getModuleSettings(),
    getGeneralSettings(),
  ]);

  const symbol = general.currencySymbol || "$";
  const defaultCommission = new Prisma.Decimal(
    String(modules.affiliate.commissionPercent ?? 5),
  );

  // Auto-create the affiliate record the first time the page is opened.
  const affiliate = await db.affiliate.upsert({
    where: { userId: user.id },
    create: { userId: user.id, commissionPercent: defaultCommission },
    update: {},
  });

  const [referrals, payouts] = await Promise.all([
    db.user.count({ where: { referredById: user.id } }),
    db.affiliatePayout.findMany({
      where: { userId: user.id },
      orderBy: { createdAt: "desc" },
      take: 50,
    }),
  ]);

  const minPayout = new Prisma.Decimal(String(modules.affiliate.minPayout ?? 10));
  const available = new Prisma.Decimal(String(affiliate.earningsAvailable));
  const canRequest =
    modules.affiliate.enabled &&
    affiliate.enabled &&
    available.greaterThan(0) &&
    available.greaterThanOrEqualTo(minPayout);

  const referralUrl = `${appUrl()}/ref/${dbUser?.refCode ?? ""}`;

  const rows: PayoutRowDTO[] = payouts.map((p) => ({
    id: p.id,
    shortId: p.id.slice(-8).toUpperCase(),
    amount: money(p.amount, symbol),
    status: p.status,
    note: p.note ?? "",
    createdAt: iso(p.createdAt),
    processedAt: iso(p.processedAt),
  }));

  return (
    <div className="space-y-6">
      <PageHeader
        title={affiliatesTexts.title}
        description={affiliatesTexts.subtitle}
        icon={Share2}
      />

      {!modules.affiliate.enabled ? (
        <div className="flex gap-2.5 rounded-2xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900 dark:border-amber-500/25 dark:bg-amber-500/10 dark:text-amber-300">
          <Info className="mt-0.5 size-4 shrink-0" />
          <div>
            <p className="font-medium">{affiliatesTexts.disabledTitle}</p>
            <p className="text-amber-800/80 dark:text-amber-300/80">
              {affiliatesTexts.disabledHint}
            </p>
          </div>
        </div>
      ) : null}

      {modules.affiliate.enabled && !affiliate.enabled ? (
        <div className="flex gap-2.5 rounded-2xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-900 dark:border-rose-500/25 dark:bg-rose-500/10 dark:text-rose-300">
          <Info className="mt-0.5 size-4 shrink-0" />
          <div>
            <p className="font-medium">{affiliatesTexts.suspendedTitle}</p>
            <p className="text-rose-800/80 dark:text-rose-300/80">
              {affiliatesTexts.suspendedHint}
            </p>
          </div>
        </div>
      ) : null}

      <ReferralLinkCard
        url={referralUrl}
        code={dbUser?.refCode ?? "—"}
        commissionPercent={dec(affiliate.commissionPercent)}
        minPayout={money(minPayout, symbol)}
      />

      <AffiliateStats
        stats={{
          visits: formatNumber(affiliate.visits, 0),
          registrations: formatNumber(affiliate.registrations, 0),
          referrals: formatNumber(referrals, 0),
          conversionRate: conversionRate(affiliate.registrations, affiliate.visits),
          totalEarnings: money(affiliate.earningsTotal, symbol),
          availableEarnings: money(affiliate.earningsAvailable, symbol),
        }}
      />

      <PayoutRequestForm
        available={money(affiliate.earningsAvailable, symbol)}
        minPayout={money(minPayout, symbol)}
        canRequest={canRequest}
      />

      <PayoutHistory rows={rows} />

      <AffiliateHowItWorks />
    </div>
  );
}
