import {LanguageCode} from "@prisma/client";
import {PlatformRole, PreferredLanguage, SessionMembership} from "@/features/auth/types";
import {prisma} from "@/lib/db/prisma";

type SessionClaims = {
  userId: string;
  platformRole: PlatformRole;
  memberships: SessionMembership[];
  activeTenantId: string | null;
  preferredLanguage: PreferredLanguage;
};

function toPreferredLanguage(language: LanguageCode): PreferredLanguage {
  return language === "AR" ? "ar" : "en";
}

export async function getSessionClaims(userId: string): Promise<SessionClaims> {
  const user = await prisma.user.findUniqueOrThrow({
    where: {
      id: userId
    },
    include: {
      platformRoles: true,
      memberships: {
        include: {
          tenant: true
        },
        orderBy: [
          {
            isDefault: "desc"
          },
          {
            createdAt: "asc"
          }
        ]
      }
    }
  });

  const platformRole = user.platformRoles.some((item) => item.role === "SUPER_ADMIN") ? "SUPER_ADMIN" : null;
  const memberships: SessionMembership[] = user.memberships.map((membership) => ({
    tenantId: membership.tenantId,
    tenantSlug: membership.tenant.slug,
    tenantName: membership.tenant.name,
    role: membership.role as SessionMembership["role"],
    isDefault: membership.isDefault
  }));

  const activeTenantId = memberships.find((item) => item.isDefault)?.tenantId ?? memberships[0]?.tenantId ?? null;

  return {
    userId: user.id,
    platformRole,
    memberships,
    activeTenantId,
    preferredLanguage: toPreferredLanguage(user.preferredLanguage)
  };
}