/*
 * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
 */

import * as z from "zod/v3";
import { safeParse } from "../lib/schemas.js";
import { ClosedEnum } from "../types/enums.js";
import { Result as SafeParseResult } from "../types/fp.js";
import * as types from "../types/primitives.js";
import { smartUnion } from "../types/smartUnion.js";
import { SDKValidationError } from "./sdkvalidationerror.js";

/**
 * Only return members with the specified team role.
 */
export const QueryParamRole = {
  Owner: "OWNER",
  Member: "MEMBER",
  Developer: "DEVELOPER",
  Security: "SECURITY",
  Billing: "BILLING",
  Viewer: "VIEWER",
  ViewerForPlus: "VIEWER_FOR_PLUS",
  Contributor: "CONTRIBUTOR",
} as const;
/**
 * Only return members with the specified team role.
 */
export type QueryParamRole = ClosedEnum<typeof QueryParamRole>;

export type GetTeamMembersRequest = {
  /**
   * Limit how many teams should be returned
   */
  limit?: number | undefined;
  /**
   * Timestamp in milliseconds to only include members added since then.
   */
  since?: number | undefined;
  /**
   * Timestamp in milliseconds to only include members added until then.
   */
  until?: number | undefined;
  /**
   * Search team members by their name, username, and email.
   */
  search?: string | undefined;
  /**
   * Only return members with the specified team role.
   */
  role?: QueryParamRole | undefined;
  /**
   * Exclude members who belong to the specified project.
   */
  excludeProject?: string | undefined;
  /**
   * Include team members who are eligible to be members of the specified project.
   */
  eligibleMembersForProjectId?: string | undefined;
  /**
   * The Team identifier to perform the request on behalf of.
   */
  teamId: string;
  /**
   * The Team slug to perform the request on behalf of.
   */
  slug?: string | undefined;
};

/**
 * Information about the GitHub account for this user.
 */
export type GetTeamMembersGithub = {
  login?: string | undefined;
};

/**
 * Information about the GitLab account of this user.
 */
export type GetTeamMembersGitlab = {
  login?: string | undefined;
};

/**
 * Information about the Bitbucket account of this user.
 */
export type GetTeamMembersBitbucket = {
  login?: string | undefined;
};

/**
 * Role of this user in the team.
 */
export const GetTeamMembersRole = {
  Billing: "BILLING",
  Contributor: "CONTRIBUTOR",
  Developer: "DEVELOPER",
  Member: "MEMBER",
  Owner: "OWNER",
  Security: "SECURITY",
  Viewer: "VIEWER",
  ViewerForPlus: "VIEWER_FOR_PLUS",
} as const;
/**
 * Role of this user in the team.
 */
export type GetTeamMembersRole = ClosedEnum<typeof GetTeamMembersRole>;

export const GetTeamMembersOrigin = {
  AccountUpdate: "account-update",
  Bitbucket: "bitbucket",
  Dsync: "dsync",
  Feedback: "feedback",
  Github: "github",
  Gitlab: "gitlab",
  Import: "import",
  Link: "link",
  Mail: "mail",
  NsnbAutoApprove: "nsnb-auto-approve",
  NsnbHobbyUpgrade: "nsnb-hobby-upgrade",
  NsnbInvite: "nsnb-invite",
  NsnbRedeploy: "nsnb-redeploy",
  NsnbRedeployAttributionCard: "nsnb-redeploy-attribution-card",
  NsnbRequestAccess: "nsnb-request-access",
  NsnbViewerUpgrade: "nsnb-viewer-upgrade",
  OrganizationTeams: "organization-teams",
  Saml: "saml",
  Teams: "teams",
} as const;
export type GetTeamMembersOrigin = ClosedEnum<typeof GetTeamMembersOrigin>;

export type GetTeamMembersGitUserId = string | number;

/**
 * Map with information about the members origin if they joined by requesting access.
 */
export type GetTeamMembersJoinedFrom = {
  origin: GetTeamMembersOrigin;
  commitId?: string | undefined;
  repoId?: string | undefined;
  repoPath?: string | undefined;
  gitUserId?: string | number | undefined;
  gitUserLogin?: string | undefined;
  ssoUserId?: string | undefined;
  ssoConnectedAt?: number | undefined;
  idpUserId?: string | undefined;
  dsyncUserId?: string | undefined;
  dsyncConnectedAt?: number | undefined;
};

export const GetTeamMembersTeamsResponseRole = {
  Admin: "ADMIN",
  ProjectDeveloper: "PROJECT_DEVELOPER",
  ProjectGuest: "PROJECT_GUEST",
  ProjectViewer: "PROJECT_VIEWER",
} as const;
export type GetTeamMembersTeamsResponseRole = ClosedEnum<
  typeof GetTeamMembersTeamsResponseRole
>;

/**
 * Array of project memberships
 */
export type GetTeamMembersProjects = {
  name: string;
  id: string;
  role?: GetTeamMembersTeamsResponseRole | undefined;
};

export type GetTeamMembersMembers = {
  /**
   * ID of the file for the Avatar of this member.
   */
  avatar?: string | undefined;
  /**
   * Boolean that indicates if this member was confirmed by an owner.
   */
  confirmed: boolean;
  /**
   * The email of this member.
   */
  email: string;
  /**
   * Information about the GitHub account for this user.
   */
  github?: GetTeamMembersGithub | undefined;
  /**
   * Information about the GitLab account of this user.
   */
  gitlab?: GetTeamMembersGitlab | undefined;
  /**
   * Information about the Bitbucket account of this user.
   */
  bitbucket?: GetTeamMembersBitbucket | undefined;
  /**
   * Role of this user in the team.
   */
  role: GetTeamMembersRole;
  /**
   * The ID of this user.
   */
  uid: string;
  /**
   * The unique username of this user.
   */
  username: string;
  /**
   * The name of this user.
   */
  name?: string | undefined;
  /**
   * Timestamp in milliseconds when this member was added.
   */
  createdAt: number;
  /**
   * Timestamp in milliseconds for when this team member was accepted by an owner.
   */
  accessRequestedAt?: number | undefined;
  /**
   * Map with information about the members origin if they joined by requesting access.
   */
  joinedFrom?: GetTeamMembersJoinedFrom | undefined;
  /**
   * Array of project memberships
   */
  projects?: Array<GetTeamMembersProjects> | undefined;
  /**
   * Indicates whether the user is managed by an enterprise.
   */
  isEnterpriseManaged?: boolean | undefined;
};

export const GetTeamMembersTeamsRole = {
  Billing: "BILLING",
  Contributor: "CONTRIBUTOR",
  Developer: "DEVELOPER",
  Member: "MEMBER",
  Owner: "OWNER",
  Security: "SECURITY",
  Viewer: "VIEWER",
  ViewerForPlus: "VIEWER_FOR_PLUS",
} as const;
export type GetTeamMembersTeamsRole = ClosedEnum<
  typeof GetTeamMembersTeamsRole
>;

export const GetTeamMembersTeamRoles = {
  Billing: "BILLING",
  Contributor: "CONTRIBUTOR",
  Developer: "DEVELOPER",
  Member: "MEMBER",
  Owner: "OWNER",
  Security: "SECURITY",
  Viewer: "VIEWER",
  ViewerForPlus: "VIEWER_FOR_PLUS",
} as const;
export type GetTeamMembersTeamRoles = ClosedEnum<
  typeof GetTeamMembersTeamRoles
>;

export const GetTeamMembersTeamPermissions = {
  CreateProject: "CreateProject",
  EnvVariableManager: "EnvVariableManager",
  EnvironmentManager: "EnvironmentManager",
  FullProductionDeployment: "FullProductionDeployment",
  IntegrationManager: "IntegrationManager",
  OrgAdmin: "OrgAdmin",
  OrgViewer: "OrgViewer",
  UsageViewer: "UsageViewer",
  V0Builder: "V0Builder",
  V0Chatter: "V0Chatter",
  V0Viewer: "V0Viewer",
} as const;
export type GetTeamMembersTeamPermissions = ClosedEnum<
  typeof GetTeamMembersTeamPermissions
>;

export const GetTeamMembersTeamsProjects = {
  Admin: "ADMIN",
  ProjectDeveloper: "PROJECT_DEVELOPER",
  ProjectGuest: "PROJECT_GUEST",
  ProjectViewer: "PROJECT_VIEWER",
} as const;
export type GetTeamMembersTeamsProjects = ClosedEnum<
  typeof GetTeamMembersTeamsProjects
>;

export type EmailInviteCodes = {
  accessGroups?: Array<string> | undefined;
  id: string;
  email?: string | undefined;
  role?: GetTeamMembersTeamsRole | undefined;
  teamRoles?: Array<GetTeamMembersTeamRoles> | undefined;
  teamPermissions?: Array<GetTeamMembersTeamPermissions> | undefined;
  isDSyncUser: boolean;
  createdAt?: number | undefined;
  expired?: true | undefined;
  projects?: { [k: string]: GetTeamMembersTeamsProjects } | undefined;
  entitlements?: Array<string> | undefined;
};

export type GetTeamMembersPagination = {
  hasNext: boolean;
  /**
   * Amount of items in the current page.
   */
  count: number;
  /**
   * Timestamp that must be used to request the next page.
   */
  next: number | null;
  /**
   * Timestamp that must be used to request the previous page.
   */
  prev: number | null;
};

export type GetTeamMembersResponseBody = {
  members: Array<GetTeamMembersMembers>;
  emailInviteCodes?: Array<EmailInviteCodes> | undefined;
  pagination: GetTeamMembersPagination;
};

/** @internal */
export const QueryParamRole$outboundSchema: z.ZodNativeEnum<
  typeof QueryParamRole
> = z.nativeEnum(QueryParamRole);

/** @internal */
export type GetTeamMembersRequest$Outbound = {
  limit?: number | undefined;
  since?: number | undefined;
  until?: number | undefined;
  search?: string | undefined;
  role?: string | undefined;
  excludeProject?: string | undefined;
  eligibleMembersForProjectId?: string | undefined;
  teamId: string;
  slug?: string | undefined;
};

/** @internal */
export const GetTeamMembersRequest$outboundSchema: z.ZodType<
  GetTeamMembersRequest$Outbound,
  z.ZodTypeDef,
  GetTeamMembersRequest
> = z.object({
  limit: z.number().optional(),
  since: z.number().optional(),
  until: z.number().optional(),
  search: z.string().optional(),
  role: QueryParamRole$outboundSchema.optional(),
  excludeProject: z.string().optional(),
  eligibleMembersForProjectId: z.string().optional(),
  teamId: z.string(),
  slug: z.string().optional(),
});

export function getTeamMembersRequestToJSON(
  getTeamMembersRequest: GetTeamMembersRequest,
): string {
  return JSON.stringify(
    GetTeamMembersRequest$outboundSchema.parse(getTeamMembersRequest),
  );
}

/** @internal */
export const GetTeamMembersGithub$inboundSchema: z.ZodType<
  GetTeamMembersGithub,
  z.ZodTypeDef,
  unknown
> = z.object({
  login: types.optional(types.string()),
});

export function getTeamMembersGithubFromJSON(
  jsonString: string,
): SafeParseResult<GetTeamMembersGithub, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTeamMembersGithub$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTeamMembersGithub' from JSON`,
  );
}

/** @internal */
export const GetTeamMembersGitlab$inboundSchema: z.ZodType<
  GetTeamMembersGitlab,
  z.ZodTypeDef,
  unknown
> = z.object({
  login: types.optional(types.string()),
});

export function getTeamMembersGitlabFromJSON(
  jsonString: string,
): SafeParseResult<GetTeamMembersGitlab, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTeamMembersGitlab$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTeamMembersGitlab' from JSON`,
  );
}

/** @internal */
export const GetTeamMembersBitbucket$inboundSchema: z.ZodType<
  GetTeamMembersBitbucket,
  z.ZodTypeDef,
  unknown
> = z.object({
  login: types.optional(types.string()),
});

export function getTeamMembersBitbucketFromJSON(
  jsonString: string,
): SafeParseResult<GetTeamMembersBitbucket, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTeamMembersBitbucket$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTeamMembersBitbucket' from JSON`,
  );
}

/** @internal */
export const GetTeamMembersRole$inboundSchema: z.ZodNativeEnum<
  typeof GetTeamMembersRole
> = z.nativeEnum(GetTeamMembersRole);

/** @internal */
export const GetTeamMembersOrigin$inboundSchema: z.ZodNativeEnum<
  typeof GetTeamMembersOrigin
> = z.nativeEnum(GetTeamMembersOrigin);

/** @internal */
export const GetTeamMembersGitUserId$inboundSchema: z.ZodType<
  GetTeamMembersGitUserId,
  z.ZodTypeDef,
  unknown
> = smartUnion([types.string(), types.number()]);

export function getTeamMembersGitUserIdFromJSON(
  jsonString: string,
): SafeParseResult<GetTeamMembersGitUserId, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTeamMembersGitUserId$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTeamMembersGitUserId' from JSON`,
  );
}

/** @internal */
export const GetTeamMembersJoinedFrom$inboundSchema: z.ZodType<
  GetTeamMembersJoinedFrom,
  z.ZodTypeDef,
  unknown
> = z.object({
  origin: GetTeamMembersOrigin$inboundSchema,
  commitId: types.optional(types.string()),
  repoId: types.optional(types.string()),
  repoPath: types.optional(types.string()),
  gitUserId: types.optional(smartUnion([types.string(), types.number()])),
  gitUserLogin: types.optional(types.string()),
  ssoUserId: types.optional(types.string()),
  ssoConnectedAt: types.optional(types.number()),
  idpUserId: types.optional(types.string()),
  dsyncUserId: types.optional(types.string()),
  dsyncConnectedAt: types.optional(types.number()),
});

export function getTeamMembersJoinedFromFromJSON(
  jsonString: string,
): SafeParseResult<GetTeamMembersJoinedFrom, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTeamMembersJoinedFrom$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTeamMembersJoinedFrom' from JSON`,
  );
}

/** @internal */
export const GetTeamMembersTeamsResponseRole$inboundSchema: z.ZodNativeEnum<
  typeof GetTeamMembersTeamsResponseRole
> = z.nativeEnum(GetTeamMembersTeamsResponseRole);

/** @internal */
export const GetTeamMembersProjects$inboundSchema: z.ZodType<
  GetTeamMembersProjects,
  z.ZodTypeDef,
  unknown
> = z.object({
  name: types.string(),
  id: types.string(),
  role: types.optional(GetTeamMembersTeamsResponseRole$inboundSchema),
});

export function getTeamMembersProjectsFromJSON(
  jsonString: string,
): SafeParseResult<GetTeamMembersProjects, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTeamMembersProjects$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTeamMembersProjects' from JSON`,
  );
}

/** @internal */
export const GetTeamMembersMembers$inboundSchema: z.ZodType<
  GetTeamMembersMembers,
  z.ZodTypeDef,
  unknown
> = z.object({
  avatar: types.optional(types.string()),
  confirmed: types.boolean(),
  email: types.string(),
  github: types.optional(z.lazy(() => GetTeamMembersGithub$inboundSchema)),
  gitlab: types.optional(z.lazy(() => GetTeamMembersGitlab$inboundSchema)),
  bitbucket: types.optional(
    z.lazy(() => GetTeamMembersBitbucket$inboundSchema),
  ),
  role: GetTeamMembersRole$inboundSchema,
  uid: types.string(),
  username: types.string(),
  name: types.optional(types.string()),
  createdAt: types.number(),
  accessRequestedAt: types.optional(types.number()),
  joinedFrom: types.optional(
    z.lazy(() => GetTeamMembersJoinedFrom$inboundSchema),
  ),
  projects: types.optional(
    z.array(z.lazy(() => GetTeamMembersProjects$inboundSchema)),
  ),
  isEnterpriseManaged: types.optional(types.boolean()),
});

export function getTeamMembersMembersFromJSON(
  jsonString: string,
): SafeParseResult<GetTeamMembersMembers, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTeamMembersMembers$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTeamMembersMembers' from JSON`,
  );
}

/** @internal */
export const GetTeamMembersTeamsRole$inboundSchema: z.ZodNativeEnum<
  typeof GetTeamMembersTeamsRole
> = z.nativeEnum(GetTeamMembersTeamsRole);

/** @internal */
export const GetTeamMembersTeamRoles$inboundSchema: z.ZodNativeEnum<
  typeof GetTeamMembersTeamRoles
> = z.nativeEnum(GetTeamMembersTeamRoles);

/** @internal */
export const GetTeamMembersTeamPermissions$inboundSchema: z.ZodNativeEnum<
  typeof GetTeamMembersTeamPermissions
> = z.nativeEnum(GetTeamMembersTeamPermissions);

/** @internal */
export const GetTeamMembersTeamsProjects$inboundSchema: z.ZodNativeEnum<
  typeof GetTeamMembersTeamsProjects
> = z.nativeEnum(GetTeamMembersTeamsProjects);

/** @internal */
export const EmailInviteCodes$inboundSchema: z.ZodType<
  EmailInviteCodes,
  z.ZodTypeDef,
  unknown
> = z.object({
  accessGroups: types.optional(z.array(types.string())),
  id: types.string(),
  email: types.optional(types.string()),
  role: types.optional(GetTeamMembersTeamsRole$inboundSchema),
  teamRoles: types.optional(z.array(GetTeamMembersTeamRoles$inboundSchema)),
  teamPermissions: types.optional(
    z.array(GetTeamMembersTeamPermissions$inboundSchema),
  ),
  isDSyncUser: types.boolean(),
  createdAt: types.optional(types.number()),
  expired: types.optional(types.literal(true)),
  projects: types.optional(z.record(GetTeamMembersTeamsProjects$inboundSchema)),
  entitlements: types.optional(z.array(types.string())),
});

export function emailInviteCodesFromJSON(
  jsonString: string,
): SafeParseResult<EmailInviteCodes, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => EmailInviteCodes$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'EmailInviteCodes' from JSON`,
  );
}

/** @internal */
export const GetTeamMembersPagination$inboundSchema: z.ZodType<
  GetTeamMembersPagination,
  z.ZodTypeDef,
  unknown
> = z.object({
  hasNext: types.boolean(),
  count: types.number(),
  next: types.nullable(types.number()),
  prev: types.nullable(types.number()),
});

export function getTeamMembersPaginationFromJSON(
  jsonString: string,
): SafeParseResult<GetTeamMembersPagination, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTeamMembersPagination$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTeamMembersPagination' from JSON`,
  );
}

/** @internal */
export const GetTeamMembersResponseBody$inboundSchema: z.ZodType<
  GetTeamMembersResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  members: z.array(z.lazy(() => GetTeamMembersMembers$inboundSchema)),
  emailInviteCodes: types.optional(
    z.array(z.lazy(() => EmailInviteCodes$inboundSchema)),
  ),
  pagination: z.lazy(() => GetTeamMembersPagination$inboundSchema),
});

export function getTeamMembersResponseBodyFromJSON(
  jsonString: string,
): SafeParseResult<GetTeamMembersResponseBody, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTeamMembersResponseBody$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTeamMembersResponseBody' from JSON`,
  );
}
