// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

import { APIResource } from '../../../core/resource';
import { APIPromise } from '../../../core/api-promise';
import { RequestOptions } from '../../../internal/request-options';
import { multipartFormRequestOptions } from '../../../internal/uploads';
import { path } from '../../../internal/utils/path';

export class BaseDirectUploads extends APIResource {
  static override readonly _key: readonly ['images', 'v2', 'directUploads'] = Object.freeze([
    'images',
    'v2',
    'directUploads',
  ] as const);

  /**
   * Direct uploads allow users to upload images without API keys. A common use case
   * are web apps, client-side applications, or mobile devices where users upload
   * content directly to Cloudflare Images. This method creates a draft record for a
   * future image. It returns an upload URL and an image identifier. To verify if the
   * image itself has been uploaded, send an image details request
   * (accounts/:account_identifier/images/v1/:identifier), and check that the
   * `draft: true` property is not present.
   *
   * @example
   * ```ts
   * const directUpload =
   *   await client.images.v2.directUploads.create({
   *     account_id: '023e105f4ecef8ad9ca31a8372d0c353',
   *   });
   * ```
   */
  create(params: DirectUploadCreateParams, options?: RequestOptions): APIPromise<DirectUploadCreateResponse> {
    const { account_id, ...body } = params;
    return (
      this._client.post(
        path`/accounts/${account_id}/images/v2/direct_upload`,
        multipartFormRequestOptions({ body, ...options }, this._client),
      ) as APIPromise<{ result: DirectUploadCreateResponse }>
    )._thenUnwrap((obj) => obj.result);
  }
}
export class DirectUploads extends BaseDirectUploads {}

export interface DirectUploadCreateResponse {
  /**
   * Image unique identifier.
   */
  id?: string;

  /**
   * The URL the unauthenticated upload can be performed to using a single HTTP POST
   * (multipart/form-data) request.
   */
  uploadURL?: string;
}

export interface DirectUploadCreateParams {
  /**
   * Path param: Account identifier tag.
   */
  account_id: string;

  /**
   * Body param: Optional Image Custom ID. Up to 1024 chars. Can include any number
   * of subpaths, and utf8 characters. Cannot start nor end with a / (forward slash).
   * Cannot be a UUID.
   */
  id?: string;

  /**
   * Body param: Can set the creator field with an internal user ID.
   */
  creator?: string;

  /**
   * Body param: The date after which the upload will not be accepted. Minimum: Now +
   * 2 minutes. Maximum: Now + 6 hours.
   */
  expiry?: string;

  /**
   * Body param: User modifiable key-value store. Can be used for keeping references
   * to another system of record, for managing images.
   */
  metadata?: unknown;

  /**
   * Body param: Indicates whether the image requires a signature token to be
   * accessed.
   */
  requireSignedURLs?: boolean;
}

export declare namespace DirectUploads {
  export {
    type DirectUploadCreateResponse as DirectUploadCreateResponse,
    type DirectUploadCreateParams as DirectUploadCreateParams,
  };
}
