import { notFound } from "next/navigation";
import { PageHeader } from "@/components/shared/page-header";
import { SessionDetail } from "@/features/sessions/session-detail";
import { sessions } from "@/features/sessions/mock-data";
import { mockLogs } from "@/features/chargepoints/logs/mock-data";
import { first, type SearchParams } from "@/lib/list-query";
import { getAllSessionOcppLogs, getSession } from "@/features/sessions/api";
import { isCsmsApiConfigured } from "@/lib/auth/server-config";
export const metadata = { title: "Session Details" };
export default async function Page({
  params,
  searchParams,
}: {
  params: Promise<{ id: string }>;
  searchParams: Promise<SearchParams>;
}) {
  const [{ id }, query] = await Promise.all([params, searchParams]);
  const source = isCsmsApiConfigured() ? "api" : "preview";
  let session = sessions.find((row) => row.id === id);
  let logs = session ? mockLogs(session.chargepointName, session.start) : [];
  let logError: string | undefined;

  if (source === "api") {
    try {
      session = await getSession(id);
    } catch (error) {
      if (isNotFound(error)) notFound();
      return (
        <>
          <PageHeader title="Session unavailable" parent={{ label: "Sessions", href: "/sessions" }} />
          <p role="alert" className="text-destructive">
            {apiErrorMessage(error)}
          </p>
        </>
      );
    }
    logs = [];
    if (first(query.tab) === "logs") {
      try {
        logs = await getAllSessionOcppLogs(id, {
          action: first(query.log_action),
          direction: first(query.log_direction),
          status: first(query.log_status),
        });
      } catch (error) {
        logError = apiErrorMessage(error);
      }
    }
  }
  if (!session) notFound();
  return (
    <>
      <PageHeader
        title={session.id}
        parent={{ label: "Sessions", href: "/sessions" }}
      />
      <SessionDetail
        session={session}
        tab={first(query.tab) === "logs" ? "logs" : "overview"}
        logs={logs}
        source={source}
        logError={logError}
      />
    </>
  );
}

function isNotFound(error: unknown) {
  return (
    typeof error === "object" &&
    error !== null &&
    "status" in error &&
    error.status === 404
  );
}

function apiErrorMessage(error: unknown) {
  return typeof error === "object" && error !== null && "message" in error &&
    typeof error.message === "string"
    ? error.message
    : "Unable to load session data. Please try again.";
}
