// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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 com.cloud.agent.api;

import com.cloud.host.Host;

public class StartupCommand extends Command {
    Host.Type type;
    String dataCenter;
    String pod;
    String cluster;
    String guid;
    String name;
    Long id;
    String version;
    String iqn;
    String publicIpAddress;
    String publicNetmask;
    String publicMacAddress;
    String privateIpAddress;
    String privateMacAddress;
    String privateNetmask;
    String storageIpAddress;
    String storageNetmask;
    String storageMacAddress;
    String storageIpAddressDeux;
    String storageMacAddressDeux;
    String storageNetmaskDeux;
    String agentTag;
    String resourceName;
    String gatewayIpAddress;

    public StartupCommand(Host.Type type) {
        this.type = type;
    }

    public StartupCommand(Long id, Host.Type type, String name, String dataCenter, String pod, String guid, String version) {
        super();
        this.id = id;
        this.dataCenter = dataCenter;
        this.pod = pod;
        this.guid = guid;
        this.name = name;
        this.version = version;
        this.type = type;
    }

    public StartupCommand(Long id, Host.Type type, String name, String dataCenter, String pod, String guid, String version, String gatewayIpAddress) {
		this(id, type, name, dataCenter, pod, guid, version);
		this.gatewayIpAddress = gatewayIpAddress;
    }

    public Host.Type getHostType() {
        return type;
    }

    public void setHostType(Host.Type type) {
    	this.type = type;
    }

    public String getIqn() {
        return iqn;
    }

    public void setCluster(String cluster) {
        this.cluster = cluster;
    }

    public String getCluster() {
        return cluster;
    }

    public void setIqn(String iqn) {
        this.iqn = iqn;
    }

    public String getDataCenter() {
        return dataCenter;
    }

    public String getPod() {
        return pod;
    }

    public Long getId() {
        return id;
    }

    public String getStorageIpAddressDeux() {
		return storageIpAddressDeux;
	}

	public void setStorageIpAddressDeux(String storageIpAddressDeux) {
		this.storageIpAddressDeux = storageIpAddressDeux;
	}

	public String getStorageMacAddressDeux() {
		return storageMacAddressDeux;
	}

	public void setStorageMacAddressDeux(String storageMacAddressDeux) {
		this.storageMacAddressDeux = storageMacAddressDeux;
	}

	public String getStorageNetmaskDeux() {
		return storageNetmaskDeux;
	}

	public void setStorageNetmaskDeux(String storageNetmaskDeux) {
		this.storageNetmaskDeux = storageNetmaskDeux;
	}

	public String getGuid() {
        return guid;
    }

    public String getName() {
        return name;
    }

    public String getVersion() {
        return version;
    }

    public void setDataCenter(String dataCenter) {
        this.dataCenter = dataCenter;
    }

    public void setPod(String pod) {
        this.pod = pod;
    }

    public void setGuid(String guid) {
        this.guid = guid;
    }

    public void setGuid(String guid, String resourceName) {
    	this.resourceName = resourceName;
    	this.guid = guid + "-" + resourceName;
    }

    public String getPublicNetmask() {
        return publicNetmask;
    }

    public void setPublicNetmask(String publicNetmask) {
        this.publicNetmask = publicNetmask;
    }

    public String getPublicMacAddress() {
        return publicMacAddress;
    }

    public void setPublicMacAddress(String publicMacAddress) {
        this.publicMacAddress = publicMacAddress;
    }

    public String getPrivateIpAddress() {
        return privateIpAddress;
    }

    public void setPrivateIpAddress(String privateIpAddress) {
        this.privateIpAddress = privateIpAddress;
    }

    public String getPrivateMacAddress() {
        return privateMacAddress;
    }

    public void setPrivateMacAddress(String privateMacAddress) {
        this.privateMacAddress = privateMacAddress;
    }

    public String getPrivateNetmask() {
        return privateNetmask;
    }

    public void setPrivateNetmask(String privateNetmask) {
        this.privateNetmask = privateNetmask;
    }

    public String getStorageIpAddress() {
        return storageIpAddress;
    }

    public void setStorageIpAddress(String storageIpAddress) {
        this.storageIpAddress = storageIpAddress;
    }

    public String getStorageNetmask() {
        return storageNetmask;
    }

    public void setStorageNetmask(String storageNetmask) {
        this.storageNetmask = storageNetmask;
    }

    public String getStorageMacAddress() {
        return storageMacAddress;
    }

    public void setStorageMacAddress(String storageMacAddress) {
        this.storageMacAddress = storageMacAddress;
    }

    public String getPublicIpAddress() {
        return publicIpAddress;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public void setPublicIpAddress(String publicIpAddress) {
        this.publicIpAddress = publicIpAddress;
    }

    public String getAgentTag() {
    	return agentTag;
    }

    public void setAgentTag(String tag) {
    	agentTag = tag;
    }

    public void setResourceName(String resourceName) {
    	this.resourceName = resourceName;
    }

    public String getGuidWithoutResource() {
    	if (resourceName == null) {
            return guid;
        } else {
    	  int hyph = guid.lastIndexOf('-');
    	  if (hyph == -1) {
    		  return guid;
    	  }
    	  String tmpResource = guid.substring(hyph+1, guid.length());
    	  if (resourceName.equals(tmpResource)){
    		  return guid.substring(0, hyph);
    	  } else {
    		  return guid;
    	  }
    	}
    }

    public String getResourceName() {
    	return resourceName;
    }

    public String getGatewayIpAddress() {
        return gatewayIpAddress;
    }

    public void setGatewayIpAddress(String gatewayIpAddress) {
        this.gatewayIpAddress = gatewayIpAddress;
    }


    @Override
    public boolean executeInSequence() {
        return false;
    }
}
