import { prisma } from "./prisma.js";
import type { SessionPayload } from "./auth.js";

export type SessionIdentity = {
  lawFirm: {
    id: string;
    name: string;
    slug: string;
    timezone: string;
    defaultLocale: string;
    status: string;
  } | null;
  user: {
    id: string;
    email: string;
    displayName: string;
    firstName: string;
    lastName: string;
    avatarUrl: string | null;
    primaryOfficeId: string | null;
    roleCodes: string[];
  };
};

export async function getSessionIdentity(
  session: SessionPayload,
): Promise<SessionIdentity | null> {
  const [user, roles, lawFirm, membershipRows] = await Promise.all([
    prisma.user.findFirst({
      where: {
        id: session.userId,
        is_active: true,
        deleted_at: null,
      },
    }),
    prisma.userRole.findMany({
      where: { user_id: session.userId },
      select: { role_code: true },
    }),
    session.lawFirmId
      ? prisma.lawFirm.findUnique({
          where: { id: session.lawFirmId },
        })
      : Promise.resolve(null),
    session.lawFirmId
      ? prisma.$queryRaw<Array<{ id: string }>>`
          SELECT id
          FROM workspace_memberships
          WHERE law_firm_id = ${session.lawFirmId}
            AND user_id = ${session.userId}
          LIMIT 1
        `
      : Promise.resolve([]),
  ]);

  if (!user) {
    return null;
  }

  const roleCodes = roles.map((role) => role.role_code);
  const membership = membershipRows[0] ?? null;
  const activeLawFirm =
    lawFirm && membership && !lawFirm.deleted_at && lawFirm.status === "active"
      ? {
          id: lawFirm.id,
          name: lawFirm.name,
          slug: lawFirm.slug,
          timezone: lawFirm.timezone,
          defaultLocale: lawFirm.default_locale,
          status: lawFirm.status,
        }
      : null;

  return {
    lawFirm: activeLawFirm,
    user: {
      id: user.id,
      email: user.email,
      displayName:
        user.display_name ?? `${user.first_name} ${user.last_name}`.trim(),
      firstName: user.first_name,
      lastName: user.last_name,
      avatarUrl: user.avatar_url,
      primaryOfficeId: user.primary_office_id,
      roleCodes,
    },
  };
}

export async function getSessionProfile(session: SessionPayload) {
  const identity = await getSessionIdentity(session);

  if (!identity?.lawFirm) {
    return null;
  }

  return {
    lawFirm: identity.lawFirm,
    user: identity.user,
  };
}
