import "server-only";

import {
  bool,
  cmsData,
  cmsPaths,
  idOf,
  isoOrNull,
  paginated,
  str,
  strOrNull,
} from "@/lib/cms/api";
import type { AdminRole } from "@/lib/cms/types";

/** A team member as sent to Client Components. */
export type TeamMember = {
  id: string;
  name: string;
  email: string;
  role: AdminRole;
  avatarUrl: string | null;
  isActive: boolean;
  lastLoginAt: string | null;
  createdAt: string;
};

function toTeamMember(row: unknown): TeamMember {
  return {
    id: idOf(row),
    name: str(row, "name"),
    email: str(row, "email"),
    role: str(row, "role") === "ADMIN" ? "ADMIN" : "EDITOR",
    avatarUrl: strOrNull(row, "avatar_url"),
    isActive: bool(row, "is_active", true),
    lastLoginAt: isoOrNull(row, "last_login_at"),
    createdAt: isoOrNull(row, "created_at") ?? new Date(0).toISOString(),
  };
}

/** `GET admin/users`: active members first, then by name. */
export async function listTeamMembers(): Promise<TeamMember[]> {
  const body = await cmsData<unknown>(cmsPaths.users);
  return paginated(body, toTeamMember).items.sort(
    (a, b) =>
      Number(b.isActive) - Number(a.isActive) || a.name.localeCompare(b.name),
  );
}
