/*
 * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
 */

import * as z from "zod";
import { remap as remap$ } from "../../lib/primitives.js";
import { safeParse } from "../../lib/schemas.js";
import { Result as SafeParseResult } from "../../types/fp.js";
import { SDKValidationError } from "../errors/sdkvalidationerror.js";

export type GetAudiencesRequest = {
  /**
   * Filter by a comma-separated list of parental entity types (`urn:audience:communities`). Each type must match exactly.
   */
  filterParentsTypes?: Array<string> | undefined;
  /**
   * Filter by a comma-separated list of audience IDs.
   */
  filterResultsAudiences?: Array<string> | undefined;
  /**
   * Filter by a list of audience types.
   */
  filterAudienceTypes?: Array<string> | undefined;
  /**
   * Filter by the minimum popularity percentile required for a Point of Interest (float, between 0 and 1; closer to 1 indicates higher popularity, e.g., 0.98 for the 98th percentile).
   */
  filterPopularityMin?: number | undefined;
  /**
   * Filter by the maximum popularity percentile a Point of Interest must have (float, between 0 and 1; closer to 1 indicates higher popularity, e.g., 0.98 for the 98th percentile).
   */
  filterPopularityMax?: number | undefined;
  /**
   * The page number of results to return. This is equivalent to take + offset and is the recommended approach for most use cases.
   */
  page?: number | undefined;
  /**
   * The number of results to return.
   */
  take?: number | undefined;
};

export type GetAudiencesResults = {
  entities?: Array<any> | undefined;
  duration?: number | undefined;
};

/**
 * Successful Operation
 */
export type GetAudiencesResponse = {
  success?: boolean | undefined;
  results?: GetAudiencesResults | undefined;
};

/** @internal */
export const GetAudiencesRequest$inboundSchema: z.ZodType<
  GetAudiencesRequest,
  z.ZodTypeDef,
  unknown
> = z.object({
  "filter.parents.types": z.array(z.string()).optional(),
  "filter.results.audiences": z.array(z.string()).optional(),
  "filter.audience.types": z.array(z.string()).optional(),
  "filter.popularity.min": z.number().optional(),
  "filter.popularity.max": z.number().optional(),
  page: z.number().int().optional(),
  take: z.number().int().optional(),
}).transform((v) => {
  return remap$(v, {
    "filter.parents.types": "filterParentsTypes",
    "filter.results.audiences": "filterResultsAudiences",
    "filter.audience.types": "filterAudienceTypes",
    "filter.popularity.min": "filterPopularityMin",
    "filter.popularity.max": "filterPopularityMax",
  });
});

/** @internal */
export type GetAudiencesRequest$Outbound = {
  "filter.parents.types"?: Array<string> | undefined;
  "filter.results.audiences"?: Array<string> | undefined;
  "filter.audience.types"?: Array<string> | undefined;
  "filter.popularity.min"?: number | undefined;
  "filter.popularity.max"?: number | undefined;
  page?: number | undefined;
  take?: number | undefined;
};

/** @internal */
export const GetAudiencesRequest$outboundSchema: z.ZodType<
  GetAudiencesRequest$Outbound,
  z.ZodTypeDef,
  GetAudiencesRequest
> = z.object({
  filterParentsTypes: z.array(z.string()).optional(),
  filterResultsAudiences: z.array(z.string()).optional(),
  filterAudienceTypes: z.array(z.string()).optional(),
  filterPopularityMin: z.number().optional(),
  filterPopularityMax: z.number().optional(),
  page: z.number().int().optional(),
  take: z.number().int().optional(),
}).transform((v) => {
  return remap$(v, {
    filterParentsTypes: "filter.parents.types",
    filterResultsAudiences: "filter.results.audiences",
    filterAudienceTypes: "filter.audience.types",
    filterPopularityMin: "filter.popularity.min",
    filterPopularityMax: "filter.popularity.max",
  });
});

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace GetAudiencesRequest$ {
  /** @deprecated use `GetAudiencesRequest$inboundSchema` instead. */
  export const inboundSchema = GetAudiencesRequest$inboundSchema;
  /** @deprecated use `GetAudiencesRequest$outboundSchema` instead. */
  export const outboundSchema = GetAudiencesRequest$outboundSchema;
  /** @deprecated use `GetAudiencesRequest$Outbound` instead. */
  export type Outbound = GetAudiencesRequest$Outbound;
}

export function getAudiencesRequestToJSON(
  getAudiencesRequest: GetAudiencesRequest,
): string {
  return JSON.stringify(
    GetAudiencesRequest$outboundSchema.parse(getAudiencesRequest),
  );
}

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

/** @internal */
export const GetAudiencesResults$inboundSchema: z.ZodType<
  GetAudiencesResults,
  z.ZodTypeDef,
  unknown
> = z.object({
  entities: z.array(z.any()).optional(),
  duration: z.number().optional(),
});

/** @internal */
export type GetAudiencesResults$Outbound = {
  entities?: Array<any> | undefined;
  duration?: number | undefined;
};

/** @internal */
export const GetAudiencesResults$outboundSchema: z.ZodType<
  GetAudiencesResults$Outbound,
  z.ZodTypeDef,
  GetAudiencesResults
> = z.object({
  entities: z.array(z.any()).optional(),
  duration: z.number().optional(),
});

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace GetAudiencesResults$ {
  /** @deprecated use `GetAudiencesResults$inboundSchema` instead. */
  export const inboundSchema = GetAudiencesResults$inboundSchema;
  /** @deprecated use `GetAudiencesResults$outboundSchema` instead. */
  export const outboundSchema = GetAudiencesResults$outboundSchema;
  /** @deprecated use `GetAudiencesResults$Outbound` instead. */
  export type Outbound = GetAudiencesResults$Outbound;
}

export function getAudiencesResultsToJSON(
  getAudiencesResults: GetAudiencesResults,
): string {
  return JSON.stringify(
    GetAudiencesResults$outboundSchema.parse(getAudiencesResults),
  );
}

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

/** @internal */
export const GetAudiencesResponse$inboundSchema: z.ZodType<
  GetAudiencesResponse,
  z.ZodTypeDef,
  unknown
> = z.object({
  success: z.boolean().optional(),
  results: z.lazy(() => GetAudiencesResults$inboundSchema).optional(),
});

/** @internal */
export type GetAudiencesResponse$Outbound = {
  success?: boolean | undefined;
  results?: GetAudiencesResults$Outbound | undefined;
};

/** @internal */
export const GetAudiencesResponse$outboundSchema: z.ZodType<
  GetAudiencesResponse$Outbound,
  z.ZodTypeDef,
  GetAudiencesResponse
> = z.object({
  success: z.boolean().optional(),
  results: z.lazy(() => GetAudiencesResults$outboundSchema).optional(),
});

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace GetAudiencesResponse$ {
  /** @deprecated use `GetAudiencesResponse$inboundSchema` instead. */
  export const inboundSchema = GetAudiencesResponse$inboundSchema;
  /** @deprecated use `GetAudiencesResponse$outboundSchema` instead. */
  export const outboundSchema = GetAudiencesResponse$outboundSchema;
  /** @deprecated use `GetAudiencesResponse$Outbound` instead. */
  export type Outbound = GetAudiencesResponse$Outbound;
}

export function getAudiencesResponseToJSON(
  getAudiencesResponse: GetAudiencesResponse,
): string {
  return JSON.stringify(
    GetAudiencesResponse$outboundSchema.parse(getAudiencesResponse),
  );
}

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