/*
 * 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 {
  Capabilities,
  Capabilities$inboundSchema,
  CreateIntegrationStoreDirectIntegrationsMetadata,
  CreateIntegrationStoreDirectIntegrationsMetadata$inboundSchema,
  CreateIntegrationStoreDirectOwnership,
  CreateIntegrationStoreDirectOwnership$inboundSchema,
  CreateIntegrationStoreDirectProjectFilter,
  CreateIntegrationStoreDirectProjectFilter$inboundSchema,
  CreateIntegrationStoreDirectProjectsMetadata,
  CreateIntegrationStoreDirectProjectsMetadata$inboundSchema,
  CreateIntegrationStoreDirectStatus,
  CreateIntegrationStoreDirectStatus$inboundSchema,
  ExternalResourceStatus,
  ExternalResourceStatus$inboundSchema,
} from "./createintegrationstoredirectpropertiesintegrationsitems.js";
import {
  CreateIntegrationStoreDirectProtocolSettings,
  CreateIntegrationStoreDirectProtocolSettings$inboundSchema,
  Product,
  Product$inboundSchema,
} from "./createintegrationstoredirectprotocolsettings.js";
import { SDKValidationError } from "./sdkvalidationerror.js";

export const CreateIntegrationStoreDirectLevel = {
  Error: "error",
  Info: "info",
  Warn: "warn",
} as const;
export type CreateIntegrationStoreDirectLevel = ClosedEnum<
  typeof CreateIntegrationStoreDirectLevel
>;

export type CreateIntegrationStoreDirectNotification = {
  title: string;
  level: CreateIntegrationStoreDirectLevel;
  message?: string | undefined;
  href?: string | undefined;
};

export type CreateIntegrationStoreDirectSecrets = {
  name: string;
  length: number;
  frameworkPublishable?: boolean | undefined;
};

export const CreateIntegrationStoreDirectType = {
  Prepayment: "prepayment",
  Subscription: "subscription",
} as const;
export type CreateIntegrationStoreDirectType = ClosedEnum<
  typeof CreateIntegrationStoreDirectType
>;

export const CreateIntegrationStoreDirectScope = {
  Installation: "installation",
  Resource: "resource",
} as const;
export type CreateIntegrationStoreDirectScope = ClosedEnum<
  typeof CreateIntegrationStoreDirectScope
>;

export type CreateIntegrationStoreDirectDetails = {
  label: string;
  value?: string | undefined;
};

export type CreateIntegrationStoreDirectHighlightedDetails = {
  label: string;
  value?: string | undefined;
};

export type CreateIntegrationStoreDirectQuote = {
  line: string;
  amount: string;
};

export type CreateIntegrationStoreDirectBillingPlan = {
  id: string;
  type: CreateIntegrationStoreDirectType;
  description: string;
  name: string;
  scope: CreateIntegrationStoreDirectScope;
  paymentMethodRequired: boolean;
  preauthorizationAmount?: number | undefined;
  initialCharge?: string | undefined;
  minimumAmount?: string | undefined;
  maximumAmount?: string | undefined;
  maximumAmountAutoPurchasePerPeriod?: string | undefined;
  cost?: string | undefined;
  details?: Array<CreateIntegrationStoreDirectDetails> | undefined;
  highlightedDetails?:
    | Array<CreateIntegrationStoreDirectHighlightedDetails>
    | undefined;
  quote?: Array<CreateIntegrationStoreDirectQuote> | undefined;
  effectiveDate?: string | undefined;
  disabled?: boolean | undefined;
};

/**
 * The deployment targets that this resource is available for.
 */
export const CreateIntegrationStoreDirectTargets = {
  Development: "development",
  Preview: "preview",
  Production: "production",
} as const;
/**
 * The deployment targets that this resource is available for.
 */
export type CreateIntegrationStoreDirectTargets = ClosedEnum<
  typeof CreateIntegrationStoreDirectTargets
>;

export type CreateIntegrationStoreDirectStore = {
  projectsMetadata: Array<CreateIntegrationStoreDirectProjectsMetadata>;
  projectFilter?: CreateIntegrationStoreDirectProjectFilter | undefined;
  totalConnectedProjects?: number | undefined;
  usageQuotaExceeded: boolean;
  status: CreateIntegrationStoreDirectStatus | null;
  ownership?: CreateIntegrationStoreDirectOwnership | undefined;
  capabilities?: Capabilities | undefined;
  metadata?:
    | { [k: string]: CreateIntegrationStoreDirectIntegrationsMetadata }
    | undefined;
  externalResourceId: string;
  externalResourceStatus?: ExternalResourceStatus | null | undefined;
  directPartnerConsoleUrl?: string | undefined;
  product: Product;
  protocolSettings?: CreateIntegrationStoreDirectProtocolSettings | undefined;
  notification?: CreateIntegrationStoreDirectNotification | undefined;
  secrets: Array<CreateIntegrationStoreDirectSecrets>;
  billingPlan?: CreateIntegrationStoreDirectBillingPlan | undefined;
  /**
   * The timestamp when secret rotation was requested.
   */
  secretRotationRequestedAt?: number | undefined;
  /**
   * The reason for the secret rotation request.
   */
  secretRotationRequestedReason?: string | undefined;
  /**
   * The ID of the user/team who requested the secret rotation.
   */
  secretRotationRequestedBy?: string | undefined;
  /**
   * The timestamp when secret rotation was completed.
   */
  secretRotationCompletedAt?: number | undefined;
  /**
   * The ID of the parent resource. Used to establish a parent-child relationship between resources, such as sandbox resources linking to their owner account resource.
   */
  parentId?: string | undefined;
  /**
   * The deployment targets that this resource is available for.
   */
  targets?: Array<CreateIntegrationStoreDirectTargets> | undefined;
};

export type CreateIntegrationStoreDirectResponseBody = {
  store: CreateIntegrationStoreDirectStore | null;
};

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

/** @internal */
export const CreateIntegrationStoreDirectNotification$inboundSchema: z.ZodType<
  CreateIntegrationStoreDirectNotification,
  z.ZodTypeDef,
  unknown
> = z.object({
  title: types.string(),
  level: CreateIntegrationStoreDirectLevel$inboundSchema,
  message: types.optional(types.string()),
  href: types.optional(types.string()),
});

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

/** @internal */
export const CreateIntegrationStoreDirectSecrets$inboundSchema: z.ZodType<
  CreateIntegrationStoreDirectSecrets,
  z.ZodTypeDef,
  unknown
> = z.object({
  name: types.string(),
  length: types.number(),
  frameworkPublishable: types.optional(types.boolean()),
});

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

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

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

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

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

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

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

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

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

/** @internal */
export const CreateIntegrationStoreDirectBillingPlan$inboundSchema: z.ZodType<
  CreateIntegrationStoreDirectBillingPlan,
  z.ZodTypeDef,
  unknown
> = z.object({
  id: types.string(),
  type: CreateIntegrationStoreDirectType$inboundSchema,
  description: types.string(),
  name: types.string(),
  scope: CreateIntegrationStoreDirectScope$inboundSchema,
  paymentMethodRequired: types.boolean(),
  preauthorizationAmount: types.optional(types.number()),
  initialCharge: types.optional(types.string()),
  minimumAmount: types.optional(types.string()),
  maximumAmount: types.optional(types.string()),
  maximumAmountAutoPurchasePerPeriod: types.optional(types.string()),
  cost: types.optional(types.string()),
  details: types.optional(
    z.array(z.lazy(() => CreateIntegrationStoreDirectDetails$inboundSchema)),
  ),
  highlightedDetails: types.optional(
    z.array(z.lazy(() =>
      CreateIntegrationStoreDirectHighlightedDetails$inboundSchema
    )),
  ),
  quote: types.optional(
    z.array(z.lazy(() => CreateIntegrationStoreDirectQuote$inboundSchema)),
  ),
  effectiveDate: types.optional(types.string()),
  disabled: types.optional(types.boolean()),
});

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

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

/** @internal */
export const CreateIntegrationStoreDirectStore$inboundSchema: z.ZodType<
  CreateIntegrationStoreDirectStore,
  z.ZodTypeDef,
  unknown
> = z.object({
  projectsMetadata: z.array(
    CreateIntegrationStoreDirectProjectsMetadata$inboundSchema,
  ),
  projectFilter: types.optional(
    CreateIntegrationStoreDirectProjectFilter$inboundSchema,
  ),
  totalConnectedProjects: types.optional(types.number()),
  usageQuotaExceeded: types.boolean(),
  status: types.nullable(CreateIntegrationStoreDirectStatus$inboundSchema),
  ownership: types.optional(
    CreateIntegrationStoreDirectOwnership$inboundSchema,
  ),
  capabilities: types.optional(Capabilities$inboundSchema),
  metadata: types.optional(
    z.record(CreateIntegrationStoreDirectIntegrationsMetadata$inboundSchema),
  ),
  externalResourceId: types.string(),
  externalResourceStatus: z.nullable(ExternalResourceStatus$inboundSchema)
    .optional(),
  directPartnerConsoleUrl: types.optional(types.string()),
  product: Product$inboundSchema,
  protocolSettings: types.optional(
    CreateIntegrationStoreDirectProtocolSettings$inboundSchema,
  ),
  notification: types.optional(
    z.lazy(() => CreateIntegrationStoreDirectNotification$inboundSchema),
  ),
  secrets: z.array(
    z.lazy(() => CreateIntegrationStoreDirectSecrets$inboundSchema),
  ),
  billingPlan: types.optional(
    z.lazy(() => CreateIntegrationStoreDirectBillingPlan$inboundSchema),
  ),
  secretRotationRequestedAt: types.optional(types.number()),
  secretRotationRequestedReason: types.optional(types.string()),
  secretRotationRequestedBy: types.optional(types.string()),
  secretRotationCompletedAt: types.optional(types.number()),
  parentId: types.optional(types.string()),
  targets: types.optional(
    z.array(CreateIntegrationStoreDirectTargets$inboundSchema),
  ),
});

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

/** @internal */
export const CreateIntegrationStoreDirectResponseBody$inboundSchema: z.ZodType<
  CreateIntegrationStoreDirectResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  store: types.nullable(
    z.lazy(() => CreateIntegrationStoreDirectStore$inboundSchema),
  ),
});

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