/*
 * 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 SubjectTypeOther = {
  type: string;
  additionalProperties?: { [k: string]: any } | undefined;
};

export const CreateConnectorAuthorizationRequestSubjectConnectRequestType = {
  JwtBearer: "jwt-bearer",
} as const;
export type CreateConnectorAuthorizationRequestSubjectConnectRequestType =
  ClosedEnum<
    typeof CreateConnectorAuthorizationRequestSubjectConnectRequestType
  >;

export type SubjectTypeJwtBearer = {
  type: CreateConnectorAuthorizationRequestSubjectConnectRequestType;
  sub?: string | undefined;
  iss?: string | undefined;
  aud?: string | undefined;
  additionalClaims?: { [k: string]: any } | undefined;
  additionalProperties?: { [k: string]: any } | undefined;
};

export const CreateConnectorAuthorizationRequestSubjectConnectType = {
  User: "user",
} as const;
export type CreateConnectorAuthorizationRequestSubjectConnectType = ClosedEnum<
  typeof CreateConnectorAuthorizationRequestSubjectConnectType
>;

export type SubjectTypeUser = {
  type: CreateConnectorAuthorizationRequestSubjectConnectType;
  id?: string | undefined;
  issuer?: string | undefined;
  additionalProperties?: { [k: string]: any } | undefined;
};

export const CreateConnectorAuthorizationRequestSubjectType = {
  App: "app",
} as const;
export type CreateConnectorAuthorizationRequestSubjectType = ClosedEnum<
  typeof CreateConnectorAuthorizationRequestSubjectType
>;

export type SubjectTypeApp = {
  type: CreateConnectorAuthorizationRequestSubjectType;
  additionalProperties?: { [k: string]: any } | undefined;
};

export type CreateConnectorAuthorizationRequestSubject =
  | SubjectTypeApp
  | SubjectTypeUser
  | SubjectTypeJwtBearer
  | SubjectTypeOther;

export type CreateConnectorAuthorizationRequestAuthorizationDetails = {
  type?: string | undefined;
  additionalProperties?: { [k: string]: any } | undefined;
};

export type CreateConnectorAuthorizationRequestRequestBody = {
  subject?:
    | SubjectTypeApp
    | SubjectTypeUser
    | SubjectTypeJwtBearer
    | SubjectTypeOther
    | undefined;
  installationId?: string | undefined;
  audience?: Array<string> | undefined;
  scopes?: Array<string> | undefined;
  resources?: Array<string> | undefined;
  authorizationDetails?:
    | Array<CreateConnectorAuthorizationRequestAuthorizationDetails>
    | undefined;
  validityBufferMs?: number | undefined;
  returnUrl?: string | undefined;
  webhook?: string | undefined;
  prompt?: string | undefined;
  deviceCode?: boolean | undefined;
  expiresInMs?: number | undefined;
  additionalParams?: { [k: string]: string } | undefined;
};

export type CreateConnectorAuthorizationRequestRequest = {
  connector: string;
  requestBody?: CreateConnectorAuthorizationRequestRequestBody | undefined;
};

export type CreateConnectorAuthorizationRequestConnector = {
  /**
   * Client id (e.g. `scl_…`).
   */
  id: string;
  /**
   * Client uid (e.g. `salesforce/my-org`).
   */
  uid: string;
  /**
   * Client type (e.g. `oauth`, `salesforce`).
   */
  type: string;
  /**
   * Resolved service id when known (e.g. `salesforce`), following the `stored.service ?? typeDef.service ?? stored.type` convention.
   */
  service?: string | undefined;
  /**
   * Curated display name of the resolved service (e.g. "Salesforce"), present when the service is a known service. Suited for end-user surfaces like "Sign in with {serviceName}".
   */
  serviceName?: string | undefined;
  /**
   * The connector's own name: the operator-given client name, falling back to the client type's name for legacy rows without one.
   */
  name: string;
};

export type CreateConnectorAuthorizationRequestResponseBody = {
  url: string;
  request: string;
  verifier: string;
  deviceCode?: string | undefined;
  expiresAt: number;
  connector: CreateConnectorAuthorizationRequestConnector;
};

/** @internal */
export type SubjectTypeOther$Outbound = {
  type: string;
  [additionalProperties: string]: unknown;
};

/** @internal */
export const SubjectTypeOther$outboundSchema: z.ZodType<
  SubjectTypeOther$Outbound,
  z.ZodTypeDef,
  SubjectTypeOther
> = z.object({
  type: z.string(),
  additionalProperties: z.record(z.any()).optional(),
}).transform((v) => {
  return {
    ...v.additionalProperties,
    ...remap$(v, {
      additionalProperties: null,
    }),
  };
});

export function subjectTypeOtherToJSON(
  subjectTypeOther: SubjectTypeOther,
): string {
  return JSON.stringify(
    SubjectTypeOther$outboundSchema.parse(subjectTypeOther),
  );
}

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

/** @internal */
export type SubjectTypeJwtBearer$Outbound = {
  type: string;
  sub?: string | undefined;
  iss?: string | undefined;
  aud?: string | undefined;
  additionalClaims?: { [k: string]: any } | undefined;
  [additionalProperties: string]: unknown;
};

/** @internal */
export const SubjectTypeJwtBearer$outboundSchema: z.ZodType<
  SubjectTypeJwtBearer$Outbound,
  z.ZodTypeDef,
  SubjectTypeJwtBearer
> = z.object({
  type:
    CreateConnectorAuthorizationRequestSubjectConnectRequestType$outboundSchema,
  sub: z.string().optional(),
  iss: z.string().optional(),
  aud: z.string().optional(),
  additionalClaims: z.record(z.any()).optional(),
  additionalProperties: z.record(z.any()).optional(),
}).transform((v) => {
  return {
    ...v.additionalProperties,
    ...remap$(v, {
      additionalProperties: null,
    }),
  };
});

export function subjectTypeJwtBearerToJSON(
  subjectTypeJwtBearer: SubjectTypeJwtBearer,
): string {
  return JSON.stringify(
    SubjectTypeJwtBearer$outboundSchema.parse(subjectTypeJwtBearer),
  );
}

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

/** @internal */
export type SubjectTypeUser$Outbound = {
  type: string;
  id?: string | undefined;
  issuer?: string | undefined;
  [additionalProperties: string]: unknown;
};

/** @internal */
export const SubjectTypeUser$outboundSchema: z.ZodType<
  SubjectTypeUser$Outbound,
  z.ZodTypeDef,
  SubjectTypeUser
> = z.object({
  type: CreateConnectorAuthorizationRequestSubjectConnectType$outboundSchema,
  id: z.string().optional(),
  issuer: z.string().optional(),
  additionalProperties: z.record(z.any()).optional(),
}).transform((v) => {
  return {
    ...v.additionalProperties,
    ...remap$(v, {
      additionalProperties: null,
    }),
  };
});

export function subjectTypeUserToJSON(
  subjectTypeUser: SubjectTypeUser,
): string {
  return JSON.stringify(SubjectTypeUser$outboundSchema.parse(subjectTypeUser));
}

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

/** @internal */
export type SubjectTypeApp$Outbound = {
  type: string;
  [additionalProperties: string]: unknown;
};

/** @internal */
export const SubjectTypeApp$outboundSchema: z.ZodType<
  SubjectTypeApp$Outbound,
  z.ZodTypeDef,
  SubjectTypeApp
> = z.object({
  type: CreateConnectorAuthorizationRequestSubjectType$outboundSchema,
  additionalProperties: z.record(z.any()).optional(),
}).transform((v) => {
  return {
    ...v.additionalProperties,
    ...remap$(v, {
      additionalProperties: null,
    }),
  };
});

export function subjectTypeAppToJSON(subjectTypeApp: SubjectTypeApp): string {
  return JSON.stringify(SubjectTypeApp$outboundSchema.parse(subjectTypeApp));
}

/** @internal */
export type CreateConnectorAuthorizationRequestSubject$Outbound =
  | SubjectTypeApp$Outbound
  | SubjectTypeUser$Outbound
  | SubjectTypeJwtBearer$Outbound
  | SubjectTypeOther$Outbound;

/** @internal */
export const CreateConnectorAuthorizationRequestSubject$outboundSchema:
  z.ZodType<
    CreateConnectorAuthorizationRequestSubject$Outbound,
    z.ZodTypeDef,
    CreateConnectorAuthorizationRequestSubject
  > = smartUnion([
    z.lazy(() => SubjectTypeApp$outboundSchema),
    z.lazy(() => SubjectTypeUser$outboundSchema),
    z.lazy(() => SubjectTypeJwtBearer$outboundSchema),
    z.lazy(() => SubjectTypeOther$outboundSchema),
  ]);

export function createConnectorAuthorizationRequestSubjectToJSON(
  createConnectorAuthorizationRequestSubject:
    CreateConnectorAuthorizationRequestSubject,
): string {
  return JSON.stringify(
    CreateConnectorAuthorizationRequestSubject$outboundSchema.parse(
      createConnectorAuthorizationRequestSubject,
    ),
  );
}

/** @internal */
export type CreateConnectorAuthorizationRequestAuthorizationDetails$Outbound = {
  type?: string | undefined;
  [additionalProperties: string]: unknown;
};

/** @internal */
export const CreateConnectorAuthorizationRequestAuthorizationDetails$outboundSchema:
  z.ZodType<
    CreateConnectorAuthorizationRequestAuthorizationDetails$Outbound,
    z.ZodTypeDef,
    CreateConnectorAuthorizationRequestAuthorizationDetails
  > = z.object({
    type: z.string().optional(),
    additionalProperties: z.record(z.any()).optional(),
  }).transform((v) => {
    return {
      ...v.additionalProperties,
      ...remap$(v, {
        additionalProperties: null,
      }),
    };
  });

export function createConnectorAuthorizationRequestAuthorizationDetailsToJSON(
  createConnectorAuthorizationRequestAuthorizationDetails:
    CreateConnectorAuthorizationRequestAuthorizationDetails,
): string {
  return JSON.stringify(
    CreateConnectorAuthorizationRequestAuthorizationDetails$outboundSchema
      .parse(createConnectorAuthorizationRequestAuthorizationDetails),
  );
}

/** @internal */
export type CreateConnectorAuthorizationRequestRequestBody$Outbound = {
  subject?:
    | SubjectTypeApp$Outbound
    | SubjectTypeUser$Outbound
    | SubjectTypeJwtBearer$Outbound
    | SubjectTypeOther$Outbound
    | undefined;
  installationId?: string | undefined;
  audience?: Array<string> | undefined;
  scopes?: Array<string> | undefined;
  resources?: Array<string> | undefined;
  authorizationDetails?:
    | Array<CreateConnectorAuthorizationRequestAuthorizationDetails$Outbound>
    | undefined;
  validityBufferMs?: number | undefined;
  returnUrl?: string | undefined;
  webhook?: string | undefined;
  prompt?: string | undefined;
  deviceCode?: boolean | undefined;
  expiresInMs?: number | undefined;
  additionalParams?: { [k: string]: string } | undefined;
};

/** @internal */
export const CreateConnectorAuthorizationRequestRequestBody$outboundSchema:
  z.ZodType<
    CreateConnectorAuthorizationRequestRequestBody$Outbound,
    z.ZodTypeDef,
    CreateConnectorAuthorizationRequestRequestBody
  > = z.object({
    subject: smartUnion([
      z.lazy(() => SubjectTypeApp$outboundSchema),
      z.lazy(() => SubjectTypeUser$outboundSchema),
      z.lazy(() => SubjectTypeJwtBearer$outboundSchema),
      z.lazy(() => SubjectTypeOther$outboundSchema),
    ]).optional(),
    installationId: z.string().optional(),
    audience: z.array(z.string()).optional(),
    scopes: z.array(z.string()).optional(),
    resources: z.array(z.string()).optional(),
    authorizationDetails: z.array(
      z.lazy(() =>
        CreateConnectorAuthorizationRequestAuthorizationDetails$outboundSchema
      ),
    ).optional(),
    validityBufferMs: z.number().optional(),
    returnUrl: z.string().optional(),
    webhook: z.string().optional(),
    prompt: z.string().optional(),
    deviceCode: z.boolean().optional(),
    expiresInMs: z.number().optional(),
    additionalParams: z.record(z.string()).optional(),
  });

export function createConnectorAuthorizationRequestRequestBodyToJSON(
  createConnectorAuthorizationRequestRequestBody:
    CreateConnectorAuthorizationRequestRequestBody,
): string {
  return JSON.stringify(
    CreateConnectorAuthorizationRequestRequestBody$outboundSchema.parse(
      createConnectorAuthorizationRequestRequestBody,
    ),
  );
}

/** @internal */
export type CreateConnectorAuthorizationRequestRequest$Outbound = {
  connector: string;
  RequestBody?:
    | CreateConnectorAuthorizationRequestRequestBody$Outbound
    | undefined;
};

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

export function createConnectorAuthorizationRequestRequestToJSON(
  createConnectorAuthorizationRequestRequest:
    CreateConnectorAuthorizationRequestRequest,
): string {
  return JSON.stringify(
    CreateConnectorAuthorizationRequestRequest$outboundSchema.parse(
      createConnectorAuthorizationRequestRequest,
    ),
  );
}

/** @internal */
export const CreateConnectorAuthorizationRequestConnector$inboundSchema:
  z.ZodType<
    CreateConnectorAuthorizationRequestConnector,
    z.ZodTypeDef,
    unknown
  > = z.object({
    id: types.string(),
    uid: types.string(),
    type: types.string(),
    service: types.optional(types.string()),
    serviceName: types.optional(types.string()),
    name: types.string(),
  });

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

/** @internal */
export const CreateConnectorAuthorizationRequestResponseBody$inboundSchema:
  z.ZodType<
    CreateConnectorAuthorizationRequestResponseBody,
    z.ZodTypeDef,
    unknown
  > = z.object({
    url: types.string(),
    request: types.string(),
    verifier: types.string(),
    deviceCode: types.optional(types.string()),
    expiresAt: types.number(),
    connector: z.lazy(() =>
      CreateConnectorAuthorizationRequestConnector$inboundSchema
    ),
  });

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