/*
 * 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 { ClosedEnum } from "../../types/enums.js";
import {
  DocumentURLChunk,
  DocumentURLChunk$Outbound,
  DocumentURLChunk$outboundSchema,
} from "./documenturlchunk.js";
import {
  FileChunk,
  FileChunk$Outbound,
  FileChunk$outboundSchema,
} from "./filechunk.js";
import {
  ImageURLChunk,
  ImageURLChunk$Outbound,
  ImageURLChunk$outboundSchema,
} from "./imageurlchunk.js";
import {
  ResponseFormat,
  ResponseFormat$Outbound,
  ResponseFormat$outboundSchema,
} from "./responseformat.js";

/**
 * Document to run OCR on
 */
export type Document = FileChunk | DocumentURLChunk | ImageURLChunk;

export const TableFormat = {
  Markdown: "markdown",
  Html: "html",
} as const;
export type TableFormat = ClosedEnum<typeof TableFormat>;

export type OCRRequest = {
  model: string | null;
  id?: string | undefined;
  /**
   * Document to run OCR on
   */
  document: FileChunk | DocumentURLChunk | ImageURLChunk;
  /**
   * Specific pages user wants to process in various formats: single number, range, or list of both. Starts from 0
   */
  pages?: Array<number> | null | undefined;
  /**
   * Include image URLs in response
   */
  includeImageBase64?: boolean | null | undefined;
  /**
   * Max images to extract
   */
  imageLimit?: number | null | undefined;
  /**
   * Minimum height and width of image to extract
   */
  imageMinSize?: number | null | undefined;
  /**
   * Structured output class for extracting useful information from each extracted bounding box / image from document. Only json_schema is valid for this field
   */
  bboxAnnotationFormat?: ResponseFormat | null | undefined;
  /**
   * Structured output class for extracting useful information from the entire document. Only json_schema is valid for this field
   */
  documentAnnotationFormat?: ResponseFormat | null | undefined;
  tableFormat?: TableFormat | null | undefined;
  extractHeader?: boolean | undefined;
  extractFooter?: boolean | undefined;
};

/** @internal */
export type Document$Outbound =
  | FileChunk$Outbound
  | DocumentURLChunk$Outbound
  | ImageURLChunk$Outbound;

/** @internal */
export const Document$outboundSchema: z.ZodType<
  Document$Outbound,
  z.ZodTypeDef,
  Document
> = z.union([
  FileChunk$outboundSchema,
  DocumentURLChunk$outboundSchema,
  ImageURLChunk$outboundSchema,
]);

export function documentToJSON(document: Document): string {
  return JSON.stringify(Document$outboundSchema.parse(document));
}

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

/** @internal */
export type OCRRequest$Outbound = {
  model: string | null;
  id?: string | undefined;
  document:
    | FileChunk$Outbound
    | DocumentURLChunk$Outbound
    | ImageURLChunk$Outbound;
  pages?: Array<number> | null | undefined;
  include_image_base64?: boolean | null | undefined;
  image_limit?: number | null | undefined;
  image_min_size?: number | null | undefined;
  bbox_annotation_format?: ResponseFormat$Outbound | null | undefined;
  document_annotation_format?: ResponseFormat$Outbound | null | undefined;
  table_format?: string | null | undefined;
  extract_header?: boolean | undefined;
  extract_footer?: boolean | undefined;
};

/** @internal */
export const OCRRequest$outboundSchema: z.ZodType<
  OCRRequest$Outbound,
  z.ZodTypeDef,
  OCRRequest
> = z.object({
  model: z.nullable(z.string()),
  id: z.string().optional(),
  document: z.union([
    FileChunk$outboundSchema,
    DocumentURLChunk$outboundSchema,
    ImageURLChunk$outboundSchema,
  ]),
  pages: z.nullable(z.array(z.number().int())).optional(),
  includeImageBase64: z.nullable(z.boolean()).optional(),
  imageLimit: z.nullable(z.number().int()).optional(),
  imageMinSize: z.nullable(z.number().int()).optional(),
  bboxAnnotationFormat: z.nullable(ResponseFormat$outboundSchema).optional(),
  documentAnnotationFormat: z.nullable(ResponseFormat$outboundSchema)
    .optional(),
  tableFormat: z.nullable(TableFormat$outboundSchema).optional(),
  extractHeader: z.boolean().optional(),
  extractFooter: z.boolean().optional(),
}).transform((v) => {
  return remap$(v, {
    includeImageBase64: "include_image_base64",
    imageLimit: "image_limit",
    imageMinSize: "image_min_size",
    bboxAnnotationFormat: "bbox_annotation_format",
    documentAnnotationFormat: "document_annotation_format",
    tableFormat: "table_format",
    extractHeader: "extract_header",
    extractFooter: "extract_footer",
  });
});

export function ocrRequestToJSON(ocrRequest: OCRRequest): string {
  return JSON.stringify(OCRRequest$outboundSchema.parse(ocrRequest));
}
