controller :messages do
  friendly_name 'Messages API'
  description 'This API allows you to access message details'
  authenticator :server

  action :message do
    title 'Return message details'
    description 'Returns all details about a message'
    param :id, 'The ID of the message', type: Integer, required: true
    returns Hash, structure: :message, structure_opts: { paramable: { expansions: false } }
    error 'MessageNotFound', 'No message found matching provided ID', attributes: { id: 'The ID of the message' }
    action do
      begin
        message = identity.server.message(params.id)
      rescue Postal::MessageDB::Message::NotFound => e
        error 'MessageNotFound', id: params.id
      end
      structure :message, message, return: true
    end
  end

  action :deliveries do
    title 'Return deliveries for a message'
    description 'Returns an array of deliveries which have been attempted for this message'
    param :id, 'The ID of the message', type: Integer, required: true
    returns Array, structure: :delivery, structure_opts: { full: true }
    error 'MessageNotFound', 'No message found matching provided ID', attributes: { id: 'The ID of the message' }
    action do
      begin
        message = identity.server.message(params.id)
      rescue Postal::MessageDB::Message::NotFound => e
        error 'MessageNotFound', id: params.id
      end
      message.deliveries.map do |d|
        structure :delivery, d
      end
    end
  end
end
