// This file is auto-generated by @hey-api/openapi-ts

import type { Options as ClientOptions, TDataShape, Client } from '@hey-api/client-fetch'
import type {
  CreateChatCompletionData,
  CreateChatCompletionResponse,
  CreateChatCompletionError,
  GenerateImageData,
  GenerateImageResponse,
  GenerateImageError,
  ModelsData,
  ModelsResponse,
  ModelsError,
  BalanceData,
  BalanceResponse,
  BalanceError,
  GenerateVideoData,
  GenerateVideoResponse,
  GenerateVideoError,
  CheckVideoStatusData,
  CheckVideoStatusResponse,
  CheckVideoStatusError
} from './types.gen.js'
import { client as _heyApiClient } from './client.gen.js'

export type Options<
  TData extends TDataShape = TDataShape,
  ThrowOnError extends boolean = boolean
> = ClientOptions<TData, ThrowOnError> & {
  /**
   * You can provide a client instance returned by `createClient()` instead of
   * individual options. This might be also useful if you want to implement a
   * custom client.
   */
  client?: Client
  /**
   * You can pass arbitrary values through the `meta` object. This can be
   * used to access values that aren't defined as part of the SDK function.
   */
  meta?: Record<string, unknown>
}

/**
 * Create a chat completion
 * Generate a chat-based completion using the specified parameters.
 */
export const createChatCompletion = <ThrowOnError extends boolean = false>(
  options: Options<CreateChatCompletionData, ThrowOnError>
) => {
  return (options.client ?? _heyApiClient).post<
    CreateChatCompletionResponse,
    CreateChatCompletionError,
    ThrowOnError
  >({
    security: [
      {
        scheme: 'bearer',
        type: 'http'
      },
      {
        name: 'x-api-key',
        type: 'apiKey'
      }
    ],
    url: '/v1/chat/completions',
    ...options,
    headers: {
      'Content-Type': 'application/json',
      ...options?.headers
    }
  })
}

/**
 * Generate an image
 * Create an image based on the provided prompt and parameters.
 */
export const generateImage = <ThrowOnError extends boolean = false>(
  options: Options<GenerateImageData, ThrowOnError>
) => {
  return (options.client ?? _heyApiClient).post<
    GenerateImageResponse,
    GenerateImageError,
    ThrowOnError
  >({
    security: [
      {
        name: 'x-api-key',
        type: 'apiKey'
      }
    ],
    url: '/generate-image',
    ...options,
    headers: {
      'Content-Type': 'application/json',
      ...options?.headers
    }
  })
}

/**
 * Retrieve available models
 * Retrieve all available models on the OpenAI models endpoint format
 */
export const models = <ThrowOnError extends boolean = false>(
  options?: Options<ModelsData, ThrowOnError>
) => {
  return (options?.client ?? _heyApiClient).get<ModelsResponse, ModelsError, ThrowOnError>({
    security: [
      {
        scheme: 'bearer',
        type: 'http'
      }
    ],
    url: '/v1/models',
    ...options
  })
}

/**
 * Check nano balance for account
 * Returns balance, receivable and earned for the account
 */
export const balance = <ThrowOnError extends boolean = false>(
  options?: Options<BalanceData, ThrowOnError>
) => {
  return (options?.client ?? _heyApiClient).post<BalanceResponse, BalanceError, ThrowOnError>({
    security: [
      {
        name: 'x-api-key',
        type: 'apiKey'
      }
    ],
    url: '/check-nano-balance',
    ...options
  })
}

/**
 * Generate a video
 * Create a video based on the provided prompt or script and parameters
 */
export const generateVideo = <ThrowOnError extends boolean = false>(
  options: Options<GenerateVideoData, ThrowOnError>
) => {
  return (options.client ?? _heyApiClient).post<
    GenerateVideoResponse,
    GenerateVideoError,
    ThrowOnError
  >({
    security: [
      {
        name: 'x-api-key',
        type: 'apiKey'
      }
    ],
    url: '/v1/video',
    ...options,
    headers: {
      'Content-Type': 'application/json',
      ...options?.headers
    }
  })
}

/**
 * Check video generation status
 * Check the status of a previously initiated video generation request
 */
export const checkVideoStatus = <ThrowOnError extends boolean = false>(
  options: Options<CheckVideoStatusData, ThrowOnError>
) => {
  return (options.client ?? _heyApiClient).get<
    CheckVideoStatusResponse,
    CheckVideoStatusError,
    ThrowOnError
  >({
    security: [
      {
        name: 'x-api-key',
        type: 'apiKey'
      }
    ],
    url: '/v1/video/status',
    ...options
  })
}
