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

export type GetIntegrationLogDrainsRequest = {
  /**
   * 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;
};

/**
 * The delivery log format
 */
export const GetIntegrationLogDrainsDeliveryFormat = {
  Json: "json",
  Ndjson: "ndjson",
  Protobuf: "protobuf",
} as const;
/**
 * The delivery log format
 */
export type GetIntegrationLogDrainsDeliveryFormat = ClosedEnum<
  typeof GetIntegrationLogDrainsDeliveryFormat
>;

/**
 * The sources from which logs are currently being delivered to this log drain.
 */
export const GetIntegrationLogDrainsSources = {
  Build: "build",
  Edge: "edge",
  External: "external",
  Firewall: "firewall",
  Lambda: "lambda",
  Redirect: "redirect",
  Static: "static",
} as const;
/**
 * The sources from which logs are currently being delivered to this log drain.
 */
export type GetIntegrationLogDrainsSources = ClosedEnum<
  typeof GetIntegrationLogDrainsSources
>;

/**
 * Whether the log drain was created by an integration or by a user
 */
export const CreatedFrom = {
  Integration: "integration",
  SelfServed: "self-served",
} as const;
/**
 * Whether the log drain was created by an integration or by a user
 */
export type CreatedFrom = ClosedEnum<typeof CreatedFrom>;

/**
 * The environment of log drain
 */
export const GetIntegrationLogDrainsEnvironments = {
  Preview: "preview",
  Production: "production",
} as const;
/**
 * The environment of log drain
 */
export type GetIntegrationLogDrainsEnvironments = ClosedEnum<
  typeof GetIntegrationLogDrainsEnvironments
>;

export type GetIntegrationLogDrainsSource2 = {
  kind: "integration";
  resourceId?: string | undefined;
  externalResourceId?: string | undefined;
  integrationId: string;
  integrationConfigurationId: string;
};

export type GetIntegrationLogDrainsSource1 = {
  kind: "self-served";
};

export type GetIntegrationLogDrainsSource =
  | GetIntegrationLogDrainsSource1
  | GetIntegrationLogDrainsSource2;

export type GetIntegrationLogDrainsResponseBody = {
  /**
   * The oauth2 client application id that created this log drain
   */
  clientId?: string | undefined;
  /**
   * The client configuration this log drain was created with
   */
  configurationId?: string | undefined;
  /**
   * A timestamp that tells you when the log drain was created
   */
  createdAt: number;
  /**
   * The unique identifier of the log drain. Always prefixed with `ld_`
   */
  id: string;
  /**
   * The delivery log format
   */
  deliveryFormat?: GetIntegrationLogDrainsDeliveryFormat | undefined;
  /**
   * The name of the log drain
   */
  name: string;
  /**
   * The identifier of the team or user whose events will trigger the log drain
   */
  ownerId: string;
  projectId?: string | null | undefined;
  /**
   * The identifier of the projects this log drain is associated with
   */
  projectIds?: Array<string> | undefined;
  /**
   * The URL to call when logs are generated
   */
  url: string;
  /**
   * The sources from which logs are currently being delivered to this log drain.
   */
  sources?: Array<GetIntegrationLogDrainsSources> | undefined;
  /**
   * Whether the log drain was created by an integration or by a user
   */
  createdFrom?: CreatedFrom | undefined;
  /**
   * The headers to send with the request
   */
  headers?: { [k: string]: string } | undefined;
  /**
   * The environment of log drain
   */
  environments?: Array<GetIntegrationLogDrainsEnvironments> | undefined;
  /**
   * The branch regexp of log drain
   */
  branch?: string | undefined;
  /**
   * The sampling rate of log drain
   */
  samplingRate?: number | undefined;
  source: GetIntegrationLogDrainsSource1 | GetIntegrationLogDrainsSource2;
};

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

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

export function getIntegrationLogDrainsRequestToJSON(
  getIntegrationLogDrainsRequest: GetIntegrationLogDrainsRequest,
): string {
  return JSON.stringify(
    GetIntegrationLogDrainsRequest$outboundSchema.parse(
      getIntegrationLogDrainsRequest,
    ),
  );
}

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

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

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

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

/** @internal */
export const GetIntegrationLogDrainsSource2$inboundSchema: z.ZodType<
  GetIntegrationLogDrainsSource2,
  z.ZodTypeDef,
  unknown
> = z.object({
  kind: types.literal("integration"),
  resourceId: types.optional(types.string()),
  externalResourceId: types.optional(types.string()),
  integrationId: types.string(),
  integrationConfigurationId: types.string(),
});

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

/** @internal */
export const GetIntegrationLogDrainsSource1$inboundSchema: z.ZodType<
  GetIntegrationLogDrainsSource1,
  z.ZodTypeDef,
  unknown
> = z.object({
  kind: types.literal("self-served"),
});

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

/** @internal */
export const GetIntegrationLogDrainsSource$inboundSchema: z.ZodType<
  GetIntegrationLogDrainsSource,
  z.ZodTypeDef,
  unknown
> = z.union([
  z.lazy(() => GetIntegrationLogDrainsSource1$inboundSchema),
  z.lazy(() => GetIntegrationLogDrainsSource2$inboundSchema),
]);

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

/** @internal */
export const GetIntegrationLogDrainsResponseBody$inboundSchema: z.ZodType<
  GetIntegrationLogDrainsResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  clientId: types.optional(types.string()),
  configurationId: types.optional(types.string()),
  createdAt: types.number(),
  id: types.string(),
  deliveryFormat: types.optional(
    GetIntegrationLogDrainsDeliveryFormat$inboundSchema,
  ),
  name: types.string(),
  ownerId: types.string(),
  projectId: z.nullable(types.string()).optional(),
  projectIds: types.optional(z.array(types.string())),
  url: types.string(),
  sources: types.optional(
    z.array(GetIntegrationLogDrainsSources$inboundSchema),
  ),
  createdFrom: types.optional(CreatedFrom$inboundSchema),
  headers: types.optional(z.record(types.string())),
  environments: types.optional(
    z.array(GetIntegrationLogDrainsEnvironments$inboundSchema),
  ),
  branch: types.optional(types.string()),
  samplingRate: types.optional(types.number()),
  source: z.union([
    z.lazy(() => GetIntegrationLogDrainsSource1$inboundSchema),
    z.lazy(() => GetIntegrationLogDrainsSource2$inboundSchema),
  ]),
});

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