/*
 * 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";

export const View = {
  Account: "account",
  Project: "project",
} as const;
export type View = ClosedEnum<typeof View>;

export const InstallationType = {
  Marketplace: "marketplace",
  External: "external",
  Provisioning: "provisioning",
} as const;
export type InstallationType = ClosedEnum<typeof InstallationType>;

export type GetConfigurationsRequest = {
  view: View;
  installationType?: InstallationType | undefined;
  /**
   * ID of the integration
   */
  integrationIdOrSlug?: string | undefined;
  /**
   * The Team identifier to perform the request on behalf of.
   */
  teamId?: string | undefined;
  /**
   * The Team slug to perform the request on behalf of.
   */
  slug?: string | undefined;
};

export const TagIds = {
  TagAgents: "tag_agents",
  TagAi: "tag_ai",
  TagAnalytics: "tag_analytics",
  TagAuthentication: "tag_authentication",
  TagCms: "tag_cms",
  TagCodeRepository: "tag_code_repository",
  TagCodeReview: "tag_code_review",
  TagCodeSecurity: "tag_code_security",
  TagCodeTesting: "tag_code_testing",
  TagCommerce: "tag_commerce",
  TagDatabases: "tag_databases",
  TagDevTools: "tag_dev_tools",
  TagExperimentation: "tag_experimentation",
  TagFlags: "tag_flags",
  TagLogging: "tag_logging",
  TagMessaging: "tag_messaging",
  TagMonitoring: "tag_monitoring",
  TagObservability: "tag_observability",
  TagPayments: "tag_payments",
  TagPerformance: "tag_performance",
  TagProductivity: "tag_productivity",
  TagSearching: "tag_searching",
  TagSecurity: "tag_security",
  TagSupportAgent: "tag_support_agent",
  TagTesting: "tag_testing",
  TagVideo: "tag_video",
  TagWebAutomation: "tag_web_automation",
  TagWorkflow: "tag_workflow",
} as const;
export type TagIds = ClosedEnum<typeof TagIds>;

export type ResponseBodyIntegration = {
  name: string;
  icon: string;
  isLegacy: boolean;
  flags?: Array<string> | undefined;
  assignedBetaLabelAt?: number | undefined;
  tagIds?: Array<TagIds> | undefined;
};

/**
 * The configuration status. Optional. If not defined, assume 'ready'.
 */
export const GetConfigurationsResponseBodyIntegrationsStatus = {
  Error: "error",
  Onboarding: "onboarding",
  Pending: "pending",
  Ready: "ready",
  Resumed: "resumed",
  Suspended: "suspended",
  Uninstalled: "uninstalled",
} as const;
/**
 * The configuration status. Optional. If not defined, assume 'ready'.
 */
export type GetConfigurationsResponseBodyIntegrationsStatus = ClosedEnum<
  typeof GetConfigurationsResponseBodyIntegrationsStatus
>;

/**
 * Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics.
 */
export const GetConfigurationsResponseBodyIntegrationsSource = {
  Backoffice: "backoffice",
  Cli: "cli",
  DeployButton: "deploy-button",
  External: "external",
  Marketplace: "marketplace",
  Oauth: "oauth",
  ResourceClaims: "resource-claims",
  V0: "v0",
} as const;
/**
 * Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics.
 */
export type GetConfigurationsResponseBodyIntegrationsSource = ClosedEnum<
  typeof GetConfigurationsResponseBodyIntegrationsSource
>;

export const GetConfigurationsResponseBodyIntegrationsType = {
  IntegrationConfiguration: "integration-configuration",
} as const;
export type GetConfigurationsResponseBodyIntegrationsType = ClosedEnum<
  typeof GetConfigurationsResponseBodyIntegrationsType
>;

export const GetConfigurationsResponseBodyIntegrationsDisabledReason = {
  AccountPlanDowngrade: "account-plan-downgrade",
  DisabledByAdmin: "disabled-by-admin",
  DisabledByOwner: "disabled-by-owner",
  FeatureNotAvailable: "feature-not-available",
  OriginalOwnerLeftTheTeam: "original-owner-left-the-team",
  OriginalOwnerRoleDowngraded: "original-owner-role-downgraded",
} as const;
export type GetConfigurationsResponseBodyIntegrationsDisabledReason =
  ClosedEnum<typeof GetConfigurationsResponseBodyIntegrationsDisabledReason>;

/**
 * Defines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external'
 */
export const GetConfigurationsResponseBodyInstallationType = {
  External: "external",
  Marketplace: "marketplace",
} as const;
/**
 * Defines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external'
 */
export type GetConfigurationsResponseBodyInstallationType = ClosedEnum<
  typeof GetConfigurationsResponseBodyInstallationType
>;

export type GetConfigurationsResponseBody2 = {
  integration: ResponseBodyIntegration;
  /**
   * A timestamp that tells you when the configuration was installed successfully
   */
  completedAt?: number | undefined;
  /**
   * A timestamp that tells you when the configuration was created
   */
  createdAt: number;
  /**
   * The unique identifier of the configuration
   */
  id: string;
  /**
   * The unique identifier of the app the configuration was created for
   */
  integrationId: string;
  /**
   * The user or team ID that owns the configuration
   */
  ownerId: string;
  /**
   * The configuration status. Optional. If not defined, assume 'ready'.
   */
  status?: GetConfigurationsResponseBodyIntegrationsStatus | undefined;
  /**
   * An external identifier defined by the integration vendor.
   */
  externalId?: string | undefined;
  /**
   * When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.
   */
  projects?: Array<string> | undefined;
  /**
   * Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics.
   */
  source?: GetConfigurationsResponseBodyIntegrationsSource | undefined;
  /**
   * The slug of the integration the configuration is created for.
   */
  slug: string;
  /**
   * When the configuration was created for a team, this will show the ID of the team.
   */
  teamId?: string | null | undefined;
  type: GetConfigurationsResponseBodyIntegrationsType;
  /**
   * A timestamp that tells you when the configuration was updated.
   */
  updatedAt: number;
  /**
   * The ID of the user that created the configuration.
   */
  userId: string;
  /**
   * The resources that are allowed to be accessed by the configuration.
   */
  scopes: Array<string>;
  /**
   * A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is 'transferred', meaning the associated user is changed to one with access to the team.
   */
  disabledAt?: number | undefined;
  /**
   * A timestamp that tells you when the configuration was deleted.
   */
  deletedAt?: number | null | undefined;
  /**
   * A timestamp that tells you when the configuration deletion has been started for cases when the deletion needs to be settled/approved by partners, such as when marketplace invoices have been paid.
   */
  deleteRequestedAt?: number | null | undefined;
  /**
   * Record when the customer initited deletion, independent of whether `deleteRequestedAt` gets set.
   */
  customerDeleteRequestedAt?: number | null | undefined;
  disabledReason?:
    | GetConfigurationsResponseBodyIntegrationsDisabledReason
    | undefined;
  /**
   * Defines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external'
   */
  installationType?: GetConfigurationsResponseBodyInstallationType | undefined;
};

/**
 * The configuration status. Optional. If not defined, assume 'ready'.
 */
export const GetConfigurationsResponseBodyStatus = {
  Error: "error",
  Onboarding: "onboarding",
  Pending: "pending",
  Ready: "ready",
  Resumed: "resumed",
  Suspended: "suspended",
  Uninstalled: "uninstalled",
} as const;
/**
 * The configuration status. Optional. If not defined, assume 'ready'.
 */
export type GetConfigurationsResponseBodyStatus = ClosedEnum<
  typeof GetConfigurationsResponseBodyStatus
>;

/**
 * Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics.
 */
export const GetConfigurationsResponseBodySource = {
  Backoffice: "backoffice",
  Cli: "cli",
  DeployButton: "deploy-button",
  External: "external",
  Marketplace: "marketplace",
  Oauth: "oauth",
  ResourceClaims: "resource-claims",
  V0: "v0",
} as const;
/**
 * Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics.
 */
export type GetConfigurationsResponseBodySource = ClosedEnum<
  typeof GetConfigurationsResponseBodySource
>;

export const GetConfigurationsResponseBodyType = {
  IntegrationConfiguration: "integration-configuration",
} as const;
export type GetConfigurationsResponseBodyType = ClosedEnum<
  typeof GetConfigurationsResponseBodyType
>;

export const GetConfigurationsResponseBodyDisabledReason = {
  AccountPlanDowngrade: "account-plan-downgrade",
  DisabledByAdmin: "disabled-by-admin",
  DisabledByOwner: "disabled-by-owner",
  FeatureNotAvailable: "feature-not-available",
  OriginalOwnerLeftTheTeam: "original-owner-left-the-team",
  OriginalOwnerRoleDowngraded: "original-owner-role-downgraded",
} as const;
export type GetConfigurationsResponseBodyDisabledReason = ClosedEnum<
  typeof GetConfigurationsResponseBodyDisabledReason
>;

/**
 * Defines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external'
 */
export const ResponseBodyInstallationType = {
  External: "external",
  Marketplace: "marketplace",
} as const;
/**
 * Defines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external'
 */
export type ResponseBodyInstallationType = ClosedEnum<
  typeof ResponseBodyInstallationType
>;

/**
 * The list of configurations for the authenticated user
 */
export type GetConfigurationsResponseBody1 = {
  /**
   * A timestamp that tells you when the configuration was installed successfully
   */
  completedAt?: number | undefined;
  /**
   * A timestamp that tells you when the configuration was created
   */
  createdAt?: number | undefined;
  /**
   * The unique identifier of the configuration
   */
  id?: string | undefined;
  /**
   * The unique identifier of the app the configuration was created for
   */
  integrationId?: string | undefined;
  /**
   * The user or team ID that owns the configuration
   */
  ownerId?: string | undefined;
  /**
   * The configuration status. Optional. If not defined, assume 'ready'.
   */
  status?: GetConfigurationsResponseBodyStatus | undefined;
  /**
   * An external identifier defined by the integration vendor.
   */
  externalId?: string | undefined;
  /**
   * When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.
   */
  projects?: Array<string> | undefined;
  /**
   * Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics.
   */
  source?: GetConfigurationsResponseBodySource | undefined;
  /**
   * The slug of the integration the configuration is created for.
   */
  slug?: string | undefined;
  /**
   * When the configuration was created for a team, this will show the ID of the team.
   */
  teamId?: string | null | undefined;
  type?: GetConfigurationsResponseBodyType | undefined;
  /**
   * A timestamp that tells you when the configuration was updated.
   */
  updatedAt?: number | undefined;
  /**
   * The ID of the user that created the configuration.
   */
  userId?: string | undefined;
  /**
   * The resources that are allowed to be accessed by the configuration.
   */
  scopes?: Array<string> | undefined;
  /**
   * A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is 'transferred', meaning the associated user is changed to one with access to the team.
   */
  disabledAt?: number | undefined;
  /**
   * A timestamp that tells you when the configuration was deleted.
   */
  deletedAt?: number | null | undefined;
  /**
   * A timestamp that tells you when the configuration deletion has been started for cases when the deletion needs to be settled/approved by partners, such as when marketplace invoices have been paid.
   */
  deleteRequestedAt?: number | null | undefined;
  /**
   * Record when the customer initited deletion, independent of whether `deleteRequestedAt` gets set.
   */
  customerDeleteRequestedAt?: number | null | undefined;
  disabledReason?: GetConfigurationsResponseBodyDisabledReason | undefined;
  /**
   * Defines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external'
   */
  installationType?: ResponseBodyInstallationType | undefined;
};

/**
 * The list of configurations for the authenticated user
 */
export type GetConfigurationsResponseBody =
  | Array<GetConfigurationsResponseBody1>
  | Array<GetConfigurationsResponseBody2>;

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

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

/** @internal */
export type GetConfigurationsRequest$Outbound = {
  view: string;
  installationType?: string | undefined;
  integrationIdOrSlug?: string | undefined;
  teamId?: string | undefined;
  slug?: string | undefined;
};

/** @internal */
export const GetConfigurationsRequest$outboundSchema: z.ZodType<
  GetConfigurationsRequest$Outbound,
  z.ZodTypeDef,
  GetConfigurationsRequest
> = z.object({
  view: View$outboundSchema,
  installationType: InstallationType$outboundSchema.optional(),
  integrationIdOrSlug: z.string().optional(),
  teamId: z.string().optional(),
  slug: z.string().optional(),
});

export function getConfigurationsRequestToJSON(
  getConfigurationsRequest: GetConfigurationsRequest,
): string {
  return JSON.stringify(
    GetConfigurationsRequest$outboundSchema.parse(getConfigurationsRequest),
  );
}

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

/** @internal */
export const ResponseBodyIntegration$inboundSchema: z.ZodType<
  ResponseBodyIntegration,
  z.ZodTypeDef,
  unknown
> = z.object({
  name: types.string(),
  icon: types.string(),
  isLegacy: types.boolean(),
  flags: types.optional(z.array(types.string())),
  assignedBetaLabelAt: types.optional(types.number()),
  tagIds: types.optional(z.array(TagIds$inboundSchema)),
});

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

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

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

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

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

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

/** @internal */
export const GetConfigurationsResponseBody2$inboundSchema: z.ZodType<
  GetConfigurationsResponseBody2,
  z.ZodTypeDef,
  unknown
> = z.object({
  integration: z.lazy(() => ResponseBodyIntegration$inboundSchema),
  completedAt: types.optional(types.number()),
  createdAt: types.number(),
  id: types.string(),
  integrationId: types.string(),
  ownerId: types.string(),
  status: types.optional(
    GetConfigurationsResponseBodyIntegrationsStatus$inboundSchema,
  ),
  externalId: types.optional(types.string()),
  projects: types.optional(z.array(types.string())),
  source: types.optional(
    GetConfigurationsResponseBodyIntegrationsSource$inboundSchema,
  ),
  slug: types.string(),
  teamId: z.nullable(types.string()).optional(),
  type: GetConfigurationsResponseBodyIntegrationsType$inboundSchema,
  updatedAt: types.number(),
  userId: types.string(),
  scopes: z.array(types.string()),
  disabledAt: types.optional(types.number()),
  deletedAt: z.nullable(types.number()).optional(),
  deleteRequestedAt: z.nullable(types.number()).optional(),
  customerDeleteRequestedAt: z.nullable(types.number()).optional(),
  disabledReason: types.optional(
    GetConfigurationsResponseBodyIntegrationsDisabledReason$inboundSchema,
  ),
  installationType: types.optional(
    GetConfigurationsResponseBodyInstallationType$inboundSchema,
  ),
});

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

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

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

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

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

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

/** @internal */
export const GetConfigurationsResponseBody1$inboundSchema: z.ZodType<
  GetConfigurationsResponseBody1,
  z.ZodTypeDef,
  unknown
> = z.object({
  completedAt: types.optional(types.number()),
  createdAt: types.optional(types.number()),
  id: types.optional(types.string()),
  integrationId: types.optional(types.string()),
  ownerId: types.optional(types.string()),
  status: types.optional(GetConfigurationsResponseBodyStatus$inboundSchema),
  externalId: types.optional(types.string()),
  projects: types.optional(z.array(types.string())),
  source: types.optional(GetConfigurationsResponseBodySource$inboundSchema),
  slug: types.optional(types.string()),
  teamId: z.nullable(types.string()).optional(),
  type: types.optional(GetConfigurationsResponseBodyType$inboundSchema),
  updatedAt: types.optional(types.number()),
  userId: types.optional(types.string()),
  scopes: types.optional(z.array(types.string())),
  disabledAt: types.optional(types.number()),
  deletedAt: z.nullable(types.number()).optional(),
  deleteRequestedAt: z.nullable(types.number()).optional(),
  customerDeleteRequestedAt: z.nullable(types.number()).optional(),
  disabledReason: types.optional(
    GetConfigurationsResponseBodyDisabledReason$inboundSchema,
  ),
  installationType: types.optional(ResponseBodyInstallationType$inboundSchema),
});

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

/** @internal */
export const GetConfigurationsResponseBody$inboundSchema: z.ZodType<
  GetConfigurationsResponseBody,
  z.ZodTypeDef,
  unknown
> = smartUnion([
  z.array(z.lazy(() => GetConfigurationsResponseBody1$inboundSchema)),
  z.array(z.lazy(() => GetConfigurationsResponseBody2$inboundSchema)),
]);

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