import "server-only";

import { Query } from "node-appwrite";

import { createAdminClient, getCurrentUser } from "./server";
import { DATABASE_ID, TABLES, type TenantKind, type TenantSettings } from "./schema";
import { getActiveTenantId, getUserTeams } from "./tenant";

export type ActiveContext = {
  user: { id: string; name: string; email: string };
  tenantId: string;
  kind: TenantKind | null;
  settings: TenantSettings | null;
};

export async function getActiveContext(): Promise<ActiveContext | null> {
  const user = await getCurrentUser();
  if (!user) return null;

  let tenantId = await getActiveTenantId();
  if (!tenantId) {
    const teams = await getUserTeams();
    tenantId = teams?.teams[0]?.$id ?? null;
  }
  if (!tenantId) return null;

  let settings: TenantSettings | null = null;
  try {
    const { tablesDB } = createAdminClient();
    const result = await tablesDB.listRows({
      databaseId: DATABASE_ID,
      tableId: TABLES.tenantSettings,
      queries: [Query.equal("tenantId", tenantId), Query.limit(1)],
    });
    settings = (result.rows[0] as unknown as TenantSettings) ?? null;
  } catch {
    settings = null;
  }

  return {
    user: { id: user.$id, name: user.name, email: user.email },
    tenantId,
    kind: settings?.kind ?? null,
    settings,
  };
}
