# frozen_string_literal: true

# The code was auto-generated by {this script}[https://github.com/cucumber/messages/blob/main/codegen/codegen.rb]
module Cucumber
  module Messages
    ##
    # Represents the ExternalAttachment message in Cucumber's {message protocol}[https://github.com/cucumber/messages].
    ##
    #
    # Represents an attachment that is stored externally rather than embedded in the message stream.
    #
    # This message type is used for large attachments (e.g., video files) that are already
    # on the filesystem and should not be loaded into memory. Instead of embedding the content,
    # only a URL reference is stored.
    #
    # A formatter or other consumer of messages may replace an Attachment with an ExternalAttachment if it makes sense to do so.
    ##
    class ExternalAttachment < Message
      ##
      # A URL where the attachment can be retrieved. This could be a file:// URL for
      # local filesystem paths, or an http(s):// URL for remote resources.
      ##
      attr_reader :url

      ##
      # The media type of the data. This can be any valid
      # [IANA Media Type](https://www.iana.org/assignments/media-types/media-types.xhtml)
      # as well as Cucumber-specific media types such as `text/x.cucumber.gherkin+plain`
      # and `text/x.cucumber.stacktrace+plain`
      ##
      attr_reader :media_type

      ##
      # The identifier of the test case attempt if the attachment was created during the execution of a test step
      ##
      attr_reader :test_case_started_id

      ##
      # The identifier of the test step if the attachment was created during the execution of a test step
      ##
      attr_reader :test_step_id

      ##
      # The identifier of the test run hook execution if the attachment was created during the execution of a test run hook
      ##
      attr_reader :test_run_hook_started_id

      ##
      # When the attachment was created
      ##
      attr_reader :timestamp

      def initialize(
        url: '',
        media_type: '',
        test_case_started_id: nil,
        test_step_id: nil,
        test_run_hook_started_id: nil,
        timestamp: nil
      )
        @url = url
        @media_type = media_type
        @test_case_started_id = test_case_started_id
        @test_step_id = test_step_id
        @test_run_hook_started_id = test_run_hook_started_id
        @timestamp = timestamp
        super()
      end

      ##
      # Returns a new ExternalAttachment from the given hash.
      # If the hash keys are camelCased, they are properly assigned to the
      # corresponding snake_cased attributes.
      #
      #   Cucumber::Messages::ExternalAttachment.from_h(some_hash) # => #<Cucumber::Messages::ExternalAttachment:0x... ...>
      ##
      def self.from_h(hash)
        return nil if hash.nil?

        new(
          url: hash[:url],
          media_type: hash[:mediaType],
          test_case_started_id: hash[:testCaseStartedId],
          test_step_id: hash[:testStepId],
          test_run_hook_started_id: hash[:testRunHookStartedId],
          timestamp: Timestamp.from_h(hash[:timestamp])
        )
      end
    end
  end
end
