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

import * as z from "zod/v3";
import { remap as remap$ } from "../lib/primitives.js";
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";

export type PostTeamDsyncRolesRoles2 = {
  accessGroupId: string;
};

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

export type PostTeamDsyncRolesRoles =
  | PostTeamDsyncRolesRoles2
  | PostTeamDsyncRolesRoles1;

export type PostTeamDsyncRolesRequestBody = {
  /**
   * Directory groups to role or access group mappings.
   */
  roles: { [k: string]: PostTeamDsyncRolesRoles2 | PostTeamDsyncRolesRoles1 };
};

export type PostTeamDsyncRolesRequest = {
  /**
   * 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;
  requestBody?: PostTeamDsyncRolesRequestBody | undefined;
};

export type PostTeamDsyncRolesResponseBody = {
  ok: boolean;
};

/** @internal */
export type PostTeamDsyncRolesRoles2$Outbound = {
  accessGroupId: string;
};

/** @internal */
export const PostTeamDsyncRolesRoles2$outboundSchema: z.ZodType<
  PostTeamDsyncRolesRoles2$Outbound,
  z.ZodTypeDef,
  PostTeamDsyncRolesRoles2
> = z.object({
  accessGroupId: z.string(),
});

export function postTeamDsyncRolesRoles2ToJSON(
  postTeamDsyncRolesRoles2: PostTeamDsyncRolesRoles2,
): string {
  return JSON.stringify(
    PostTeamDsyncRolesRoles2$outboundSchema.parse(postTeamDsyncRolesRoles2),
  );
}

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

/** @internal */
export type PostTeamDsyncRolesRoles$Outbound =
  | PostTeamDsyncRolesRoles2$Outbound
  | string;

/** @internal */
export const PostTeamDsyncRolesRoles$outboundSchema: z.ZodType<
  PostTeamDsyncRolesRoles$Outbound,
  z.ZodTypeDef,
  PostTeamDsyncRolesRoles
> = smartUnion([
  z.lazy(() => PostTeamDsyncRolesRoles2$outboundSchema),
  PostTeamDsyncRolesRoles1$outboundSchema,
]);

export function postTeamDsyncRolesRolesToJSON(
  postTeamDsyncRolesRoles: PostTeamDsyncRolesRoles,
): string {
  return JSON.stringify(
    PostTeamDsyncRolesRoles$outboundSchema.parse(postTeamDsyncRolesRoles),
  );
}

/** @internal */
export type PostTeamDsyncRolesRequestBody$Outbound = {
  roles: { [k: string]: PostTeamDsyncRolesRoles2$Outbound | string };
};

/** @internal */
export const PostTeamDsyncRolesRequestBody$outboundSchema: z.ZodType<
  PostTeamDsyncRolesRequestBody$Outbound,
  z.ZodTypeDef,
  PostTeamDsyncRolesRequestBody
> = z.object({
  roles: z.record(
    smartUnion([
      z.lazy(() => PostTeamDsyncRolesRoles2$outboundSchema),
      PostTeamDsyncRolesRoles1$outboundSchema,
    ]),
  ),
});

export function postTeamDsyncRolesRequestBodyToJSON(
  postTeamDsyncRolesRequestBody: PostTeamDsyncRolesRequestBody,
): string {
  return JSON.stringify(
    PostTeamDsyncRolesRequestBody$outboundSchema.parse(
      postTeamDsyncRolesRequestBody,
    ),
  );
}

/** @internal */
export type PostTeamDsyncRolesRequest$Outbound = {
  teamId: string;
  slug?: string | undefined;
  RequestBody?: PostTeamDsyncRolesRequestBody$Outbound | undefined;
};

/** @internal */
export const PostTeamDsyncRolesRequest$outboundSchema: z.ZodType<
  PostTeamDsyncRolesRequest$Outbound,
  z.ZodTypeDef,
  PostTeamDsyncRolesRequest
> = z.object({
  teamId: z.string(),
  slug: z.string().optional(),
  requestBody: z.lazy(() => PostTeamDsyncRolesRequestBody$outboundSchema)
    .optional(),
}).transform((v) => {
  return remap$(v, {
    requestBody: "RequestBody",
  });
});

export function postTeamDsyncRolesRequestToJSON(
  postTeamDsyncRolesRequest: PostTeamDsyncRolesRequest,
): string {
  return JSON.stringify(
    PostTeamDsyncRolesRequest$outboundSchema.parse(postTeamDsyncRolesRequest),
  );
}

/** @internal */
export const PostTeamDsyncRolesResponseBody$inboundSchema: z.ZodType<
  PostTeamDsyncRolesResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  ok: types.boolean(),
});

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