module RubyLLM::Providers::Bedrock

def api_base

def api_base
  @api_base ||= "https://bedrock-runtime.#{RubyLLM.config.bedrock_region}.amazonaws.com"
end

def build_headers(signature_headers, streaming: false)

def build_headers(signature_headers, streaming: false)
  accept_header = streaming ? 'application/vnd.amazon.eventstream' : 'application/json'
  signature_headers.merge(
    'Content-Type' => 'application/json',
    'Accept' => accept_header
  )
end

def build_request(url, method: :post, payload: nil)

def build_request(url, method: :post, payload: nil)
  {
    connection: connection,
    http_method: method,
    url: url || completion_url,
    body: payload ? JSON.generate(payload, ascii_only: false) : nil
  }
end

def capabilities

def capabilities
  Bedrock::Capabilities
end

def configuration_requirements

def configuration_requirements
  %i[bedrock_api_key bedrock_secret_key bedrock_region]
end

def create_signer

def create_signer
  Signing::Signer.new({
                        access_key_id: RubyLLM.config.bedrock_api_key,
                        secret_access_key: RubyLLM.config.bedrock_secret_key,
                        session_token: RubyLLM.config.bedrock_session_token,
                        region: RubyLLM.config.bedrock_region,
                        service: 'bedrock'
                      })
end

def parse_error(response) # rubocop:disable Metrics/MethodLength

rubocop:disable Metrics/MethodLength
def parse_error(response) # rubocop:disable Metrics/MethodLength
  return if response.body.empty?
  body = try_parse_json(response.body)
  case body
  when Hash
    body['message']
  when Array
    body.map do |part|
      part['message']
    end.join('. ')
  else
    body
  end
end

def post(url, payload)

def post(url, payload)
  signature = sign_request("#{connection.url_prefix}#{url}", payload:)
  connection.post url, payload do |req|
    req.headers.merge! build_headers(signature.headers, streaming: block_given?)
    yield req if block_given?
  end
end

def sign_request(url, method: :post, payload: nil)

def sign_request(url, method: :post, payload: nil)
  signer = create_signer
  request = build_request(url, method:, payload:)
  signer.sign_request(request)
end

def slug

def slug
  'bedrock'
end