/*
 * 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 { SDKValidationError } from "./sdkvalidationerror.js";

export const Events = {
  BudgetReached: "budget.reached",
  DomainCreated: "domain.created",
  DomainDnsRecordsChanged: "domain.dns.records.changed",
  DomainTransferInStarted: "domain.transfer-in.started",
  DomainTransferInCompleted: "domain.transfer-in.completed",
  DomainTransferInFailed: "domain.transfer-in.failed",
  DomainCertificateAdd: "domain.certificate.add",
  DomainCertificateAddFailed: "domain.certificate.add.failed",
  DomainCertificateRenew: "domain.certificate.renew",
  DomainCertificateRenewFailed: "domain.certificate.renew.failed",
  DomainCertificateDeleted: "domain.certificate.deleted",
  DomainRenewal: "domain.renewal",
  DomainRenewalFailed: "domain.renewal.failed",
  DomainAutoRenewChanged: "domain.auto-renew.changed",
  DeploymentCreated: "deployment.created",
  DeploymentBuildRequested: "deployment.build-requested",
  DeploymentCleanup: "deployment.cleanup",
  DeploymentError: "deployment.error",
  DeploymentBlocked: "deployment.blocked",
  DeploymentCanceled: "deployment.canceled",
  DeploymentSucceeded: "deployment.succeeded",
  DeploymentReady: "deployment.ready",
  DeploymentCheckRerequested: "deployment.check-rerequested",
  DeploymentPromoted: "deployment.promoted",
  DeploymentRollback: "deployment.rollback",
  DeploymentIntegrationActionStart: "deployment.integration.action.start",
  DeploymentIntegrationActionCancel: "deployment.integration.action.cancel",
  DeploymentIntegrationActionCleanup: "deployment.integration.action.cleanup",
  DeploymentCheckrunStart: "deployment.checkrun.start",
  DeploymentCheckrunCancel: "deployment.checkrun.cancel",
  EdgeConfigCreated: "edge-config.created",
  EdgeConfigDeleted: "edge-config.deleted",
  EdgeConfigItemsUpdated: "edge-config.items.updated",
  FirewallAttack: "firewall.attack",
  FirewallSystemRuleAnomaly: "firewall.system-rule-anomaly",
  FirewallCustomRuleAnomaly: "firewall.custom-rule-anomaly",
  FunctionArchivalRequired: "function.archival-required",
  FunctionRemovalRequired: "function.removal-required",
  AlertsTriggered: "alerts.triggered",
  IntegrationConfigurationPermissionUpgraded:
    "integration-configuration.permission-upgraded",
  IntegrationConfigurationRemoved: "integration-configuration.removed",
  IntegrationConfigurationScopeChangeConfirmed:
    "integration-configuration.scope-change-confirmed",
  IntegrationConfigurationTransferred: "integration-configuration.transferred",
  IntegrationResourceProjectConnected: "integration-resource.project-connected",
  IntegrationResourceProjectDisconnected:
    "integration-resource.project-disconnected",
  ProjectCreated: "project.created",
  ProjectRemoved: "project.removed",
  ProjectRenamed: "project.renamed",
  ProjectEnvVariableCreated: "project.env-variable.created",
  ProjectEnvVariableUpdated: "project.env-variable.updated",
  ProjectEnvVariableDeleted: "project.env-variable.deleted",
  ProjectDomainCreated: "project.domain.created",
  ProjectDomainUpdated: "project.domain.updated",
  ProjectDomainDeleted: "project.domain.deleted",
  ProjectDomainVerified: "project.domain.verified",
  ProjectDomainUnverified: "project.domain.unverified",
  ProjectDomainMoved: "project.domain.moved",
  ProjectRollingReleaseStarted: "project.rolling-release.started",
  ProjectRollingReleaseAborted: "project.rolling-release.aborted",
  ProjectRollingReleaseCompleted: "project.rolling-release.completed",
  ProjectRollingReleaseApproved: "project.rolling-release.approved",
  DeploymentChecksFailed: "deployment.checks.failed",
  DeploymentChecksSucceeded: "deployment.checks.succeeded",
  DeploymentChecksCompleted: "deployment-checks-completed",
  DeploymentReadyHyphen: "deployment-ready",
  DeploymentPreparedHyphen: "deployment-prepared",
  DeploymentErrorHyphen: "deployment-error",
  DeploymentCheckRerequestedHyphen: "deployment-check-rerequested",
  DeploymentCanceledHyphen: "deployment-canceled",
  ProjectCreatedHyphen: "project-created",
  ProjectRemovedHyphen: "project-removed",
  DomainCreatedHyphen: "domain-created",
  Deployment: "deployment",
  IntegrationConfigurationPermissionUpdatedHyphen:
    "integration-configuration-permission-updated",
  IntegrationConfigurationRemovedHyphen: "integration-configuration-removed",
  IntegrationConfigurationScopeChangeConfirmedHyphen:
    "integration-configuration-scope-change-confirmed",
  MarketplaceMemberChanged: "marketplace.member.changed",
  MarketplaceInvoiceCreated: "marketplace.invoice.created",
  MarketplaceInvoicePaid: "marketplace.invoice.paid",
  MarketplaceInvoiceNotpaid: "marketplace.invoice.notpaid",
  MarketplaceInvoiceOverdue: "marketplace.invoice.overdue",
  MarketplaceInvoiceRefunded: "marketplace.invoice.refunded",
  AiGatewayBalanceDepleted: "ai-gateway.balance-depleted",
  AiGatewayAutoReloadLimitReached: "ai-gateway.auto-reload.limit-reached",
  ObservabilityAnomaly: "observability.anomaly",
  ObservabilityAnomalyError: "observability.anomaly-error",
  ObservabilityUsageAnomaly: "observability.usage-anomaly",
  ObservabilityErrorAnomaly: "observability.error-anomaly",
  BotidAnomaly: "botid.anomaly",
  FlagCreated: "flag.created",
  FlagUpdated: "flag.updated",
  FlagDeleted: "flag.deleted",
  FlagSegmentCreated: "flag.segment.created",
  FlagSegmentUpdated: "flag.segment.updated",
  FlagSegmentDeleted: "flag.segment.deleted",
  TestWebhook: "test-webhook",
  MessageCreated: "message.created",
  MessageUpdated: "message.updated",
  MessageDeleted: "message.deleted",
  ThreadResolved: "thread.resolved",
  ThreadUnresolved: "thread.unresolved",
  MessageReactionAdded: "message.reaction-added",
  MessageReactionRemoved: "message.reaction-removed",
  MessageMentioned: "message.mentioned",
  CommentCreated: "comment.created",
  CommentUpdated: "comment.updated",
  CommentDeleted: "comment.deleted",
  CommentResolved: "comment.resolved",
  CommentUnresolved: "comment.unresolved",
  CommentReactionAdded: "comment.reaction-added",
  CommentReactionRemoved: "comment.reaction-removed",
  CommentMentioned: "comment.mentioned",
} as const;
export type Events = ClosedEnum<typeof Events>;

export type CreateWebhookRequestBody = {
  url: string;
  events: Array<Events>;
  projectIds?: Array<string> | undefined;
};

export type CreateWebhookRequest = {
  /**
   * 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;
  requestBody: CreateWebhookRequestBody;
};

/**
 * The webhooks events
 */
export const CreateWebhookEvents = {
  AiGatewayAutoReloadLimitReached: "ai-gateway.auto-reload.limit-reached",
  AiGatewayBalanceDepleted: "ai-gateway.balance-depleted",
  AlertsTriggered: "alerts.triggered",
  BotidAnomaly: "botid.anomaly",
  BudgetReached: "budget.reached",
  CommentCreated: "comment.created",
  CommentDeleted: "comment.deleted",
  CommentMentioned: "comment.mentioned",
  CommentReactionAdded: "comment.reaction-added",
  CommentReactionRemoved: "comment.reaction-removed",
  CommentResolved: "comment.resolved",
  CommentUnresolved: "comment.unresolved",
  CommentUpdated: "comment.updated",
  Deployment: "deployment",
  DeploymentCanceledHyphen: "deployment-canceled",
  DeploymentCheckRerequestedHyphen: "deployment-check-rerequested",
  DeploymentChecksCompleted: "deployment-checks-completed",
  DeploymentErrorHyphen: "deployment-error",
  DeploymentPreparedHyphen: "deployment-prepared",
  DeploymentReadyHyphen: "deployment-ready",
  DeploymentBlocked: "deployment.blocked",
  DeploymentBuildRequested: "deployment.build-requested",
  DeploymentCanceled: "deployment.canceled",
  DeploymentCheckRerequested: "deployment.check-rerequested",
  DeploymentCheckrunCancel: "deployment.checkrun.cancel",
  DeploymentCheckrunStart: "deployment.checkrun.start",
  DeploymentChecksFailed: "deployment.checks.failed",
  DeploymentChecksSucceeded: "deployment.checks.succeeded",
  DeploymentCleanup: "deployment.cleanup",
  DeploymentCreated: "deployment.created",
  DeploymentError: "deployment.error",
  DeploymentIntegrationActionCancel: "deployment.integration.action.cancel",
  DeploymentIntegrationActionCleanup: "deployment.integration.action.cleanup",
  DeploymentIntegrationActionStart: "deployment.integration.action.start",
  DeploymentPromoted: "deployment.promoted",
  DeploymentReady: "deployment.ready",
  DeploymentRollback: "deployment.rollback",
  DeploymentSucceeded: "deployment.succeeded",
  DomainCreatedHyphen: "domain-created",
  DomainAutoRenewChanged: "domain.auto-renew.changed",
  DomainCertificateAdd: "domain.certificate.add",
  DomainCertificateAddFailed: "domain.certificate.add.failed",
  DomainCertificateDeleted: "domain.certificate.deleted",
  DomainCertificateRenew: "domain.certificate.renew",
  DomainCertificateRenewFailed: "domain.certificate.renew.failed",
  DomainCreated: "domain.created",
  DomainDnsRecordsChanged: "domain.dns.records.changed",
  DomainRenewal: "domain.renewal",
  DomainRenewalFailed: "domain.renewal.failed",
  DomainTransferInCompleted: "domain.transfer-in.completed",
  DomainTransferInFailed: "domain.transfer-in.failed",
  DomainTransferInStarted: "domain.transfer-in.started",
  EdgeConfigCreated: "edge-config.created",
  EdgeConfigDeleted: "edge-config.deleted",
  EdgeConfigItemsUpdated: "edge-config.items.updated",
  FirewallAttack: "firewall.attack",
  FirewallCustomRuleAnomaly: "firewall.custom-rule-anomaly",
  FirewallSystemRuleAnomaly: "firewall.system-rule-anomaly",
  FlagCreated: "flag.created",
  FlagDeleted: "flag.deleted",
  FlagSegmentCreated: "flag.segment.created",
  FlagSegmentDeleted: "flag.segment.deleted",
  FlagSegmentUpdated: "flag.segment.updated",
  FlagUpdated: "flag.updated",
  FunctionArchivalRequired: "function.archival-required",
  FunctionRemovalRequired: "function.removal-required",
  IntegrationConfigurationPermissionUpdatedHyphen:
    "integration-configuration-permission-updated",
  IntegrationConfigurationRemovedHyphen: "integration-configuration-removed",
  IntegrationConfigurationScopeChangeConfirmedHyphen:
    "integration-configuration-scope-change-confirmed",
  IntegrationConfigurationPermissionUpgraded:
    "integration-configuration.permission-upgraded",
  IntegrationConfigurationRemoved: "integration-configuration.removed",
  IntegrationConfigurationScopeChangeConfirmed:
    "integration-configuration.scope-change-confirmed",
  IntegrationConfigurationTransferred: "integration-configuration.transferred",
  IntegrationResourceProjectConnected: "integration-resource.project-connected",
  IntegrationResourceProjectDisconnected:
    "integration-resource.project-disconnected",
  MarketplaceInvoiceCreated: "marketplace.invoice.created",
  MarketplaceInvoiceNotpaid: "marketplace.invoice.notpaid",
  MarketplaceInvoiceOverdue: "marketplace.invoice.overdue",
  MarketplaceInvoicePaid: "marketplace.invoice.paid",
  MarketplaceInvoiceRefunded: "marketplace.invoice.refunded",
  MarketplaceMemberChanged: "marketplace.member.changed",
  MessageCreated: "message.created",
  MessageDeleted: "message.deleted",
  MessageMentioned: "message.mentioned",
  MessageReactionAdded: "message.reaction-added",
  MessageReactionRemoved: "message.reaction-removed",
  MessageUpdated: "message.updated",
  ObservabilityAnomaly: "observability.anomaly",
  ObservabilityAnomalyError: "observability.anomaly-error",
  ObservabilityErrorAnomaly: "observability.error-anomaly",
  ObservabilityUsageAnomaly: "observability.usage-anomaly",
  ProjectCreatedHyphen: "project-created",
  ProjectRemovedHyphen: "project-removed",
  ProjectCreated: "project.created",
  ProjectDomainCreated: "project.domain.created",
  ProjectDomainDeleted: "project.domain.deleted",
  ProjectDomainMoved: "project.domain.moved",
  ProjectDomainUnverified: "project.domain.unverified",
  ProjectDomainUpdated: "project.domain.updated",
  ProjectDomainVerified: "project.domain.verified",
  ProjectEnvVariableCreated: "project.env-variable.created",
  ProjectEnvVariableDeleted: "project.env-variable.deleted",
  ProjectEnvVariableUpdated: "project.env-variable.updated",
  ProjectRemoved: "project.removed",
  ProjectRenamed: "project.renamed",
  ProjectRollingReleaseAborted: "project.rolling-release.aborted",
  ProjectRollingReleaseApproved: "project.rolling-release.approved",
  ProjectRollingReleaseCompleted: "project.rolling-release.completed",
  ProjectRollingReleaseStarted: "project.rolling-release.started",
  TestWebhook: "test-webhook",
  ThreadResolved: "thread.resolved",
  ThreadUnresolved: "thread.unresolved",
} as const;
/**
 * The webhooks events
 */
export type CreateWebhookEvents = ClosedEnum<typeof CreateWebhookEvents>;

export type CreateWebhookResponseBody = {
  /**
   * The webhook secret used to sign the payload
   */
  secret: string;
  /**
   * The webhooks events
   */
  events: Array<CreateWebhookEvents>;
  /**
   * The webhook id
   */
  id: string;
  /**
   * A string with the URL of the webhook
   */
  url: string;
  /**
   * The unique ID of the team the webhook belongs to
   */
  ownerId: string;
  /**
   * A number containing the date when the webhook was created in in milliseconds
   */
  createdAt: number;
  /**
   * A number containing the date when the webhook was updated in in milliseconds
   */
  updatedAt: number;
  /**
   * The ID of the projects the webhook is associated with
   */
  projectIds?: Array<string> | undefined;
};

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

/** @internal */
export type CreateWebhookRequestBody$Outbound = {
  url: string;
  events: Array<string>;
  projectIds?: Array<string> | undefined;
};

/** @internal */
export const CreateWebhookRequestBody$outboundSchema: z.ZodType<
  CreateWebhookRequestBody$Outbound,
  z.ZodTypeDef,
  CreateWebhookRequestBody
> = z.object({
  url: z.string(),
  events: z.array(Events$outboundSchema),
  projectIds: z.array(z.string()).optional(),
});

export function createWebhookRequestBodyToJSON(
  createWebhookRequestBody: CreateWebhookRequestBody,
): string {
  return JSON.stringify(
    CreateWebhookRequestBody$outboundSchema.parse(createWebhookRequestBody),
  );
}

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

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

export function createWebhookRequestToJSON(
  createWebhookRequest: CreateWebhookRequest,
): string {
  return JSON.stringify(
    CreateWebhookRequest$outboundSchema.parse(createWebhookRequest),
  );
}

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

/** @internal */
export const CreateWebhookResponseBody$inboundSchema: z.ZodType<
  CreateWebhookResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  secret: types.string(),
  events: z.array(CreateWebhookEvents$inboundSchema),
  id: types.string(),
  url: types.string(),
  ownerId: types.string(),
  createdAt: types.number(),
  updatedAt: types.number(),
  projectIds: types.optional(z.array(types.string())),
});

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