module Fog
  module Compute
    class Ecloud
      class Real
        def virtual_machine_edit_hardware_configuration(vm_uri, data)
          validate_data([:cpus, :memory, :disks, :nics], data)
          body = build_request_body_edit_hardware_configuration(data)
          request(
            :expects => 202,
            :method => "PUT",
            :headers => {},
            :body => body,
            :uri => vm_uri,
            :parse => true
          )
        end

        def build_request_body_edit_hardware_configuration(data)
          xml = Builder::XmlMarkup.new
          xml.HardwareConfiguration do
            xml.ProcessorCount data[:cpus]
            xml.Memory do
              xml.Unit "MB"
              xml.Value data[:memory]
            end
            xml.Disks do
              data[:disks].each do |disk|
                xml.Disk do
                  xml.Index disk[:Index]
                  xml.Size do
                    xml.Unit "GB"
                    xml.Value disk[:Size][:Value]
                  end
                end
              end
            end
            xml.Nics do
              data[:nics].each do |nic|
                xml.Nic do
                  xml.UnitNumber nic[:UnitNumber]
                  xml.MacAddress nic[:MacAddress]
                  xml.Network(:href => nic[:Network][:href], :name => nic[:Network][:name], :type => "application/vnd.tmrk.cloud.network") do
                  end
                end
              end
            end
          end
        end
      end

      class Mock
        def virtual_machine_edit_hardware_configuration(vm_uri, data)
          server_id = vm_uri.match(/(\d+)/)[1]

          server  = self.data[:servers][server_id.to_i]
          task_id = Fog::Mock.random_numbers(10)
          task = {
            :id            => task_id,
            :href          => "/cloudapi/ecloud/tasks/#{task_id}",
            :type          => "application/vnd.tmrk.cloud.task",
            :Operation     => "Configure Server",
            :Status        => "Complete",
            :ImpactedItem  => Fog::Ecloud.keep(server, :name, :href, :type),
            :StartTime     => Time.now.iso8601,
            :CompletedTime => Time.now.iso8601,
            :InitiatedBy   => {},
          }
          self.data[:tasks][task_id] = task

          response(:body =>  task)
        end
      end
    end
  end
end
