import { PaymentChannel } from "./types/channel.types";
import { organizationService } from "@/services/organization/organizationService";
import { getServerOrgCode } from "@/lib/org";
import { TopUpForm } from "./components/TopUpFormWithPages";
import { getTopupPaymentChannelsV1 } from "@/services/v1/topupAdapter";
import { cookies } from "next/headers";
import { isTokenExpired } from "@/lib/cookie-utils";
import { refreshTokensWithCache } from "@/lib/auth/refresh-tokens";
import { resolveTopupAccessToken } from "./topupAuth";

export const TopupModule: React.FC = async () => {
  let paymentChannels: PaymentChannel[] = [];
  let organization = null;

  try {
    // Fetch organization data
    const orgCode = await getServerOrgCode();
    organization = await organizationService.fetchByCode(orgCode || "");

    try {
      const cookieStore = await cookies();
      const accessToken = cookieStore.get('access_token')?.value || '';
      const refreshToken = cookieStore.get('refresh_token')?.value || '';
      const validAccessToken = await resolveTopupAccessToken({
        accessToken,
        refreshToken,
        isExpired: isTokenExpired,
        refresh: (token) => refreshTokensWithCache(token, 'topup-page'),
      });

      if (!validAccessToken) {
        throw new Error('Access token is missing or expired');
      }

      const response = await getTopupPaymentChannelsV1(validAccessToken);
      paymentChannels = response.ok ? response.result : [];
    } catch (channelErr: unknown) {
      console.error("Server Error: Failed to authenticate or fetch payment channels:", channelErr);
    }
  } catch (err: unknown) {
    console.error("Server Error: Failed to authenticate user:", err);
  }

  return (
    <div className="flex flex-col">
      <div className="mx-auto mt-4 min-w-[90vw] lg:min-w-[900px] space-y-6">
        <TopUpForm paymentChannels={paymentChannels} organization={organization} />
      </div>
    </div>
  );
};
