module Fog
  module Compute
    class OpenNebula
      class Real
        def vm_allocate(attr={ })

          if(attr[:flavor].nil?)
            raise(ArgumentError.new("Attribute flavor is nil! #{attr.inspect}"))
          end
          if(attr[:name].nil? || attr[:name].empty?)
            raise(ArgumentError.new("Attribute name is nil or empty! #{attr.inspect}"))
          end

          xml = ::OpenNebula::VirtualMachine.build_xml
          vm  = ::OpenNebula::VirtualMachine.new(xml, client)
          rc = vm.allocate(attr[:flavor].to_s + "\nNAME=\"" + attr[:name] + "\"") 

          # irb(main):050:0> vm.allocate(s.flavor.to_s + "\nNAME=altest5")
          # => #<OpenNebula::Error:0x00000002a50760 @message="[VirtualMachineAllocate] User [42] : Not authorized to perform CREATE VM.", @errno=512>
          # irb(main):051:0> a = vm.allocate(s.flavor.to_s + "\nNAME=altest5")
          # => #<OpenNebula::Error:0x00000002ac0998 @message="[VirtualMachineAllocate] User [42] : Not authorized to perform CREATE VM.", @errno=512>
          # irb(main):052:0> a.class

          if(rc.is_a? ::OpenNebula::Error) 
            raise(rc)
          end


          # -1 - do not change the owner
          vm.chown(-1,attr[:gid].to_i) unless attr[:gid].nil?

          # TODO
          # check if vm is created vmid.class == One error class
          vm.info!

          one = vm.to_hash
          data = {}
          data["onevm_object"] = vm
          data["status"] =  vm.state
          data["state"]  =  vm.lcm_state_str
          data["id"]     =  vm.id
          data["uuid"]   =  vm.id
          data["gid"]    =  vm.gid
          data["name"]   =  one["VM"]["NAME"] unless one["VM"]["NAME"].nil?
          data["user"]   =  one["VM"]["UNAME"] unless one["VM"]["UNAME"].nil?
          data["group"]  =  one["VM"]["GNAME"] unless one["VM"]["GNAME"].nil?

          unless ( one["VM"]["TEMPLATE"].nil? ) then
            temp = one["VM"]["TEMPLATE"]
            data["cpu"]    =  temp["VCPU"] 	unless temp["VCPU"].nil?
            data["memory"] =  temp["MEMORY"] 	unless temp["MEMORY"].nil?
            unless (temp["NIC"].nil?) then
              if one["VM"]["TEMPLATE"]["NIC"].is_a?(Array)
                data["mac"]	=	temp["NIC"][0]["MAC"] 	unless temp["NIC"][0]["MAC"].nil?
                data["ip"]	=	temp["NIC"][0]["IP"] 	unless temp["NIC"][0]["IP"].nil?
              else
                data["mac"]	=	temp["NIC"]["MAC"] 	unless temp["NIC"]["MAC"].nil?
                data["ip"]	=	temp["NIC"]["IP"] 	unless temp["NIC"]["IP"].nil?
              end
            end
          end

          data
        rescue => err
          raise(err)
        end
      end

      class Mock
        def vm_allocate(attr={ })
          response = Excon::Response.new
          response.status = 200

          id = rand(1000)
          ids = []

          self.data['vms'].each do |vm|
            ids << vm['id']
            if vm['id'] == id
              while ids.include?(id)
                id = rand(1000)
              end
              break
            end
          end

          data = {}
          data['id'] = id
					data['flavor'] = attr[:flavor]
					data['name'] = attr[:name]
          data['state'] = 'RUNNING'
          data['status'] = 3
          self.data['vms'] << data
					data
        end
      end
    end
  end
end
