import BackButton from "@/components/ui/buttons-group/ButtonBack";
import ChargingMetrics from "@/modules/sessionModule/detail/sections/ChargingMetrics";
import SessionStationInfo from "@/modules/sessionModule/detail/sections/SessionStationInfo";
import { SessionStopButton } from "@/modules/sessionModule/detail/components/SessionStopButton";
import { sessionService } from "@/services/session/sessionService";
import { Session } from "@/types/session/session";
import { notFound, redirect } from "next/navigation";
import { SessionHeader } from "./sections/SessionHeader";
import { chargePointService } from "@/services/chargepoint/chargePointService";
import { cookies } from "next/headers";
import SessionReceiptOverlay from "@/modules/sessionModule/detail/components/SessionReceiptOverlay";
import { getSessionChargePointId, shouldResolveSessionChargePointId } from "./sessionDetailUtils";
import { resolveTenantBranding } from "@/lib/tenantPresentation.server";

export default async function SessionModule({ params }: { params: { id: string } }) {
  const { id } = params;
  let session: Session | null = null;

  const cookieStore = await cookies();
  const accessToken = cookieStore.get("access_token")?.value;

  if (!accessToken) {
    return notFound();
  }

  try {
    const res = await sessionService.getSessionById(id, accessToken);
    if (res) {
      session = res;
    }
  } catch (err) {
    console.error("Server Error: Failed to fetch session:", err);
  }
  if (!session) {
    return redirect("/sessions");
  }

  const tenantBranding = await resolveTenantBranding();

  const chargePointId = getSessionChargePointId(session);
  let stopChargePointId = chargePointId;

  // Some v1 session responses contain only chargepoint_name. Resolve the
  // identifier needed by POST /v1/sessions/:id/stop from the v1 chargepoint list.
  if (shouldResolveSessionChargePointId(session)) {
    const chargePointList = await chargePointService.getChargePoints(
      { name: session.chargepoint_name, paginate_limit: 100 },
      { backend: "v1", accessToken },
    );
    const matchingChargePoint = chargePointList.data.find(
      (item) => item.name.trim().toLowerCase() === session.chargepoint_name.trim().toLowerCase(),
    );
    stopChargePointId = getSessionChargePointId(session, matchingChargePoint);
  }

  return (
    <div className="mx-auto max-w-4xl space-y-6 sm:space-y-8 mb-24 lg:mb-8">
      {/* Navigation Header */}
      <BackButton />
      {/* Session Header */}
      <SessionHeader session={session} />
      {/* Station Information */}
      <SessionStationInfo session={session} chargepoint={null} location={null} />
      {/* Charging Metrics using the component */}
      <ChargingMetrics initialSession={session} />
      {/* Always render stop control; it self-disables when session not active yet */}
      <SessionStopButton
        id={session._id || ""}
        initialSession={session}
        chargePointId={stopChargePointId}
        connectorNumber={session.connector_number}
      />
      <SessionReceiptOverlay
        session={session}
        chargepoint={null}
        location={null}
        tenantDisplayName={tenantBranding.displayName}
      />
    </div>
  );
}
