import type { CreateExpressContextOptions } from "@trpc/server/adapters/express";
import type { User } from "../../drizzle/schema";
import { jwtVerify } from "jose";
import { LOCAL_AUTH_COOKIE } from "@shared/const";
import { getUserById } from "../db";
import { ENV } from "./env";
import { sdk } from "./sdk";

export type TrpcContext = { req: CreateExpressContextOptions["req"]; res: CreateExpressContextOptions["res"]; user: User | null };

export async function createContext(opts: CreateExpressContextOptions): Promise<TrpcContext> {
  let user: User | null = null;
  try { user = await sdk.authenticateRequest(opts.req); } catch { user = null; }
  if (!user) {
    try {
      const cookies = opts.req.headers.cookie ?? "";
      const token = cookies.split(";").map(value => value.trim()).find(value => value.startsWith(`${LOCAL_AUTH_COOKIE}=`))?.split("=").slice(1).join("=");
      if (token && ENV.cookieSecret) {
        const { payload } = await jwtVerify(token, new TextEncoder().encode(ENV.cookieSecret));
        if (typeof payload.userId === "number") user = (await getUserById(payload.userId)) ?? null;
      }
    } catch { user = null; }
  }
  return { req: opts.req, res: opts.res, user };
}
