package iso

import (
	"fmt"

	vmwcommon "github.com/hashicorp/packer/builder/vmware/common"
)

// NewDriver returns a new driver implementation for this operating
// system, or an error if the driver couldn't be initialized.
func NewDriver(config *Config) (vmwcommon.Driver, error) {
	drivers := []vmwcommon.Driver{}

	if config.RemoteType == "" {
		return vmwcommon.NewDriver(&config.DriverConfig, &config.SSHConfig)
	}

	drivers = []vmwcommon.Driver{
		&ESX5Driver{
			Host:           config.RemoteHost,
			Port:           config.RemotePort,
			Username:       config.RemoteUser,
			Password:       config.RemotePassword,
			PrivateKeyFile: config.RemotePrivateKey,
			Datastore:      config.RemoteDatastore,
			CacheDatastore: config.RemoteCacheDatastore,
			CacheDirectory: config.RemoteCacheDirectory,
		},
	}

	errs := ""
	for _, driver := range drivers {
		err := driver.Verify()
		if err == nil {
			return driver, nil
		}
		errs += "* " + err.Error() + "\n"
	}

	return nil, fmt.Errorf(
		"Unable to initialize any driver for this platform. The errors\n"+
			"from each driver are shown below. Please fix at least one driver\n"+
			"to continue:\n%s", errs)
}
