# frozen_string_literal: true

module OpenAI
  module Models
    # @see OpenAI::Resources::Images#generate
    #
    # @see OpenAI::Resources::Images#generate_stream_raw
    class ImageGenerateParams < OpenAI::Internal::Type::BaseModel
      extend OpenAI::Internal::Type::RequestParameters::Converter
      include OpenAI::Internal::Type::RequestParameters

      # @!attribute prompt
      #   A text description of the desired image(s). The maximum length is 32000
      #   characters for `gpt-image-1`, 1000 characters for `dall-e-2` and 4000 characters
      #   for `dall-e-3`.
      #
      #   @return [String]
      required :prompt, String

      # @!attribute background
      #   Allows to set transparency for the background of the generated image(s). This
      #   parameter is only supported for `gpt-image-1`. Must be one of `transparent`,
      #   `opaque` or `auto` (default value). When `auto` is used, the model will
      #   automatically determine the best background for the image.
      #
      #   If `transparent`, the output format needs to support transparency, so it should
      #   be set to either `png` (default value) or `webp`.
      #
      #   @return [Symbol, OpenAI::Models::ImageGenerateParams::Background, nil]
      optional :background, enum: -> { OpenAI::ImageGenerateParams::Background }, nil?: true

      # @!attribute model
      #   The model to use for image generation. One of `dall-e-2`, `dall-e-3`, or
      #   `gpt-image-1`. Defaults to `dall-e-2` unless a parameter specific to
      #   `gpt-image-1` is used.
      #
      #   @return [String, Symbol, OpenAI::Models::ImageModel, nil]
      optional :model, union: -> { OpenAI::ImageGenerateParams::Model }, nil?: true

      # @!attribute moderation
      #   Control the content-moderation level for images generated by `gpt-image-1`. Must
      #   be either `low` for less restrictive filtering or `auto` (default value).
      #
      #   @return [Symbol, OpenAI::Models::ImageGenerateParams::Moderation, nil]
      optional :moderation, enum: -> { OpenAI::ImageGenerateParams::Moderation }, nil?: true

      # @!attribute n
      #   The number of images to generate. Must be between 1 and 10. For `dall-e-3`, only
      #   `n=1` is supported.
      #
      #   @return [Integer, nil]
      optional :n, Integer, nil?: true

      # @!attribute output_compression
      #   The compression level (0-100%) for the generated images. This parameter is only
      #   supported for `gpt-image-1` with the `webp` or `jpeg` output formats, and
      #   defaults to 100.
      #
      #   @return [Integer, nil]
      optional :output_compression, Integer, nil?: true

      # @!attribute output_format
      #   The format in which the generated images are returned. This parameter is only
      #   supported for `gpt-image-1`. Must be one of `png`, `jpeg`, or `webp`.
      #
      #   @return [Symbol, OpenAI::Models::ImageGenerateParams::OutputFormat, nil]
      optional :output_format, enum: -> { OpenAI::ImageGenerateParams::OutputFormat }, nil?: true

      # @!attribute partial_images
      #   The number of partial images to generate. This parameter is used for streaming
      #   responses that return partial images. Value must be between 0 and 3. When set to
      #   0, the response will be a single image sent in one streaming event.
      #
      #   Note that the final image may be sent before the full number of partial images
      #   are generated if the full image is generated more quickly.
      #
      #   @return [Integer, nil]
      optional :partial_images, Integer, nil?: true

      # @!attribute quality
      #   The quality of the image that will be generated.
      #
      #   - `auto` (default value) will automatically select the best quality for the
      #     given model.
      #   - `high`, `medium` and `low` are supported for `gpt-image-1`.
      #   - `hd` and `standard` are supported for `dall-e-3`.
      #   - `standard` is the only option for `dall-e-2`.
      #
      #   @return [Symbol, OpenAI::Models::ImageGenerateParams::Quality, nil]
      optional :quality, enum: -> { OpenAI::ImageGenerateParams::Quality }, nil?: true

      # @!attribute response_format
      #   The format in which generated images with `dall-e-2` and `dall-e-3` are
      #   returned. Must be one of `url` or `b64_json`. URLs are only valid for 60 minutes
      #   after the image has been generated. This parameter isn't supported for
      #   `gpt-image-1` which will always return base64-encoded images.
      #
      #   @return [Symbol, OpenAI::Models::ImageGenerateParams::ResponseFormat, nil]
      optional :response_format, enum: -> { OpenAI::ImageGenerateParams::ResponseFormat }, nil?: true

      # @!attribute size
      #   The size of the generated images. Must be one of `1024x1024`, `1536x1024`
      #   (landscape), `1024x1536` (portrait), or `auto` (default value) for
      #   `gpt-image-1`, one of `256x256`, `512x512`, or `1024x1024` for `dall-e-2`, and
      #   one of `1024x1024`, `1792x1024`, or `1024x1792` for `dall-e-3`.
      #
      #   @return [Symbol, OpenAI::Models::ImageGenerateParams::Size, nil]
      optional :size, enum: -> { OpenAI::ImageGenerateParams::Size }, nil?: true

      # @!attribute style
      #   The style of the generated images. This parameter is only supported for
      #   `dall-e-3`. Must be one of `vivid` or `natural`. Vivid causes the model to lean
      #   towards generating hyper-real and dramatic images. Natural causes the model to
      #   produce more natural, less hyper-real looking images.
      #
      #   @return [Symbol, OpenAI::Models::ImageGenerateParams::Style, nil]
      optional :style, enum: -> { OpenAI::ImageGenerateParams::Style }, nil?: true

      # @!attribute user
      #   A unique identifier representing your end-user, which can help OpenAI to monitor
      #   and detect abuse.
      #   [Learn more](https://platform.openai.com/docs/guides/safety-best-practices#end-user-ids).
      #
      #   @return [String, nil]
      optional :user, String

      # @!method initialize(prompt:, background: nil, model: nil, moderation: nil, n: nil, output_compression: nil, output_format: nil, partial_images: nil, quality: nil, response_format: nil, size: nil, style: nil, user: nil, request_options: {})
      #   Some parameter documentations has been truncated, see
      #   {OpenAI::Models::ImageGenerateParams} for more details.
      #
      #   @param prompt [String] A text description of the desired image(s). The maximum length is 32000 characte
      #
      #   @param background [Symbol, OpenAI::Models::ImageGenerateParams::Background, nil] Allows to set transparency for the background of the generated image(s).
      #
      #   @param model [String, Symbol, OpenAI::Models::ImageModel, nil] The model to use for image generation. One of `dall-e-2`, `dall-e-3`, or `gpt-im
      #
      #   @param moderation [Symbol, OpenAI::Models::ImageGenerateParams::Moderation, nil] Control the content-moderation level for images generated by `gpt-image-1`. Must
      #
      #   @param n [Integer, nil] The number of images to generate. Must be between 1 and 10. For `dall-e-3`, only
      #
      #   @param output_compression [Integer, nil] The compression level (0-100%) for the generated images. This parameter is only
      #
      #   @param output_format [Symbol, OpenAI::Models::ImageGenerateParams::OutputFormat, nil] The format in which the generated images are returned. This parameter is only su
      #
      #   @param partial_images [Integer, nil] The number of partial images to generate. This parameter is used for
      #
      #   @param quality [Symbol, OpenAI::Models::ImageGenerateParams::Quality, nil] The quality of the image that will be generated.
      #
      #   @param response_format [Symbol, OpenAI::Models::ImageGenerateParams::ResponseFormat, nil] The format in which generated images with `dall-e-2` and `dall-e-3` are returned
      #
      #   @param size [Symbol, OpenAI::Models::ImageGenerateParams::Size, nil] The size of the generated images. Must be one of `1024x1024`, `1536x1024` (lands
      #
      #   @param style [Symbol, OpenAI::Models::ImageGenerateParams::Style, nil] The style of the generated images. This parameter is only supported for `dall-e-
      #
      #   @param user [String] A unique identifier representing your end-user, which can help OpenAI to monitor
      #
      #   @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}]

      # Allows to set transparency for the background of the generated image(s). This
      # parameter is only supported for `gpt-image-1`. Must be one of `transparent`,
      # `opaque` or `auto` (default value). When `auto` is used, the model will
      # automatically determine the best background for the image.
      #
      # If `transparent`, the output format needs to support transparency, so it should
      # be set to either `png` (default value) or `webp`.
      module Background
        extend OpenAI::Internal::Type::Enum

        TRANSPARENT = :transparent
        OPAQUE = :opaque
        AUTO = :auto

        # @!method self.values
        #   @return [Array<Symbol>]
      end

      # The model to use for image generation. One of `dall-e-2`, `dall-e-3`, or
      # `gpt-image-1`. Defaults to `dall-e-2` unless a parameter specific to
      # `gpt-image-1` is used.
      module Model
        extend OpenAI::Internal::Type::Union

        variant String

        # The model to use for image generation. One of `dall-e-2`, `dall-e-3`, or `gpt-image-1`. Defaults to `dall-e-2` unless a parameter specific to `gpt-image-1` is used.
        variant enum: -> { OpenAI::ImageModel }

        # @!method self.variants
        #   @return [Array(String, Symbol, OpenAI::Models::ImageModel)]
      end

      # Control the content-moderation level for images generated by `gpt-image-1`. Must
      # be either `low` for less restrictive filtering or `auto` (default value).
      module Moderation
        extend OpenAI::Internal::Type::Enum

        LOW = :low
        AUTO = :auto

        # @!method self.values
        #   @return [Array<Symbol>]
      end

      # The format in which the generated images are returned. This parameter is only
      # supported for `gpt-image-1`. Must be one of `png`, `jpeg`, or `webp`.
      module OutputFormat
        extend OpenAI::Internal::Type::Enum

        PNG = :png
        JPEG = :jpeg
        WEBP = :webp

        # @!method self.values
        #   @return [Array<Symbol>]
      end

      # The quality of the image that will be generated.
      #
      # - `auto` (default value) will automatically select the best quality for the
      #   given model.
      # - `high`, `medium` and `low` are supported for `gpt-image-1`.
      # - `hd` and `standard` are supported for `dall-e-3`.
      # - `standard` is the only option for `dall-e-2`.
      module Quality
        extend OpenAI::Internal::Type::Enum

        STANDARD = :standard
        HD = :hd
        LOW = :low
        MEDIUM = :medium
        HIGH = :high
        AUTO = :auto

        # @!method self.values
        #   @return [Array<Symbol>]
      end

      # The format in which generated images with `dall-e-2` and `dall-e-3` are
      # returned. Must be one of `url` or `b64_json`. URLs are only valid for 60 minutes
      # after the image has been generated. This parameter isn't supported for
      # `gpt-image-1` which will always return base64-encoded images.
      module ResponseFormat
        extend OpenAI::Internal::Type::Enum

        URL = :url
        B64_JSON = :b64_json

        # @!method self.values
        #   @return [Array<Symbol>]
      end

      # The size of the generated images. Must be one of `1024x1024`, `1536x1024`
      # (landscape), `1024x1536` (portrait), or `auto` (default value) for
      # `gpt-image-1`, one of `256x256`, `512x512`, or `1024x1024` for `dall-e-2`, and
      # one of `1024x1024`, `1792x1024`, or `1024x1792` for `dall-e-3`.
      module Size
        extend OpenAI::Internal::Type::Enum

        AUTO = :auto
        SIZE_1024X1024 = :"1024x1024"
        SIZE_1536X1024 = :"1536x1024"
        SIZE_1024X1536 = :"1024x1536"
        SIZE_256X256 = :"256x256"
        SIZE_512X512 = :"512x512"
        SIZE_1792X1024 = :"1792x1024"
        SIZE_1024X1792 = :"1024x1792"

        # @!method self.values
        #   @return [Array<Symbol>]
      end

      # The style of the generated images. This parameter is only supported for
      # `dall-e-3`. Must be one of `vivid` or `natural`. Vivid causes the model to lean
      # towards generating hyper-real and dramatic images. Natural causes the model to
      # produce more natural, less hyper-real looking images.
      module Style
        extend OpenAI::Internal::Type::Enum

        VIVID = :vivid
        NATURAL = :natural

        # @!method self.values
        #   @return [Array<Symbol>]
      end
    end
  end
end
