/*
Copyright (c) 2015 VMware, Inc. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package object

import (
	"github.com/vmware/govmomi/vim25"
	"github.com/vmware/govmomi/vim25/types"
)

type Reference interface {
	Reference() types.ManagedObjectReference
}

func NewReference(c *vim25.Client, e types.ManagedObjectReference) Reference {
	switch e.Type {
	case "Folder":
		return NewFolder(c, e)
	case "StoragePod":
		return &StoragePod{
			NewFolder(c, e),
		}
	case "Datacenter":
		return NewDatacenter(c, e)
	case "VirtualMachine":
		return NewVirtualMachine(c, e)
	case "VirtualApp":
		return &VirtualApp{
			NewResourcePool(c, e),
		}
	case "ComputeResource":
		return NewComputeResource(c, e)
	case "ClusterComputeResource":
		return NewClusterComputeResource(c, e)
	case "HostSystem":
		return NewHostSystem(c, e)
	case "Network":
		return NewNetwork(c, e)
	case "OpaqueNetwork":
		return NewOpaqueNetwork(c, e)
	case "ResourcePool":
		return NewResourcePool(c, e)
	case "DistributedVirtualSwitch":
		return NewDistributedVirtualSwitch(c, e)
	case "VmwareDistributedVirtualSwitch":
		return &VmwareDistributedVirtualSwitch{*NewDistributedVirtualSwitch(c, e)}
	case "DistributedVirtualPortgroup":
		return NewDistributedVirtualPortgroup(c, e)
	case "Datastore":
		return NewDatastore(c, e)
	default:
		panic("Unknown managed entity: " + e.Type)
	}
}
