import { getDashboardSessionUser } from "@/lib/server/backend-session-user";

import { ActivityFeed } from "./_components/activity-feed";
import { AttentionQueues } from "./_components/attention-queues";
import { CustomerBreakdown } from "./_components/customer-breakdown";
import { DashboardUnavailable } from "./_components/dashboard-unavailable";
import { MetricCards } from "./_components/metric-cards";
import { PerformanceOverview } from "./_components/performance-overview";
import { SubscriberOverview } from "./_components/subscriber-overview";
import { fetchAdminDashboardOverview } from "./_lib/admin-dashboard-overview";
import { parseAdminDashboardRange } from "./_lib/admin-dashboard-types";

export const dynamic = "force-dynamic";

type PageProps = {
  searchParams: Promise<Record<string, string | undefined>>;
};

function hasPermission(
  sessionUser: Awaited<ReturnType<typeof getDashboardSessionUser>>,
  permission: string,
) {
  if (!sessionUser) return false;
  if (sessionUser.isSuperAdmin) return true;
  return sessionUser.permissions.includes(permission);
}

export default async function Page({ searchParams }: PageProps) {
  const query = await searchParams;
  const range = parseAdminDashboardRange(query.range);
  const sessionUser = await getDashboardSessionUser();
  const { overview, errorMessage } = await fetchAdminDashboardOverview(range, sessionUser);

  if (!overview) {
    return (
      <div className="@container/main flex flex-col gap-4 md:gap-6">
        <DashboardUnavailable message={errorMessage} />
      </div>
    );
  }

  const canCustomers = hasPermission(sessionUser, "customer.view");
  const canOrders = hasPermission(sessionUser, "invoice.view");

  return (
    <div className="@container/main flex flex-col gap-4 md:gap-6">
      <MetricCards kpis={overview.kpis} range={overview.range} />
      <PerformanceOverview series={overview.series} range={overview.range} />

      {canCustomers ? <CustomerBreakdown breakdowns={overview.breakdowns} /> : null}

      <div className="grid grid-cols-1 gap-4 xl:grid-cols-3">
        <div className="flex flex-col gap-4 xl:col-span-2">
          {(canCustomers || canOrders) && (
            <AttentionQueues
              pendingCustomers={canCustomers ? overview.queues.pendingCustomers : []}
              recentOrdersNeedingAttention={canOrders ? overview.queues.recentOrdersNeedingAttention : []}
            />
          )}
          {canCustomers ? (
            <SubscriberOverview
              totalCustomers={overview.kpis.customersTotal}
              recentCustomers={overview.recentCustomers}
            />
          ) : null}
        </div>
        <ActivityFeed activity={overview.activity} />
      </div>
    </div>
  );
}
