//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.hypervisor.vmware.mo;

import java.util.List;

import org.apache.log4j.Logger;

import com.vmware.vim25.KeyAnyValue;
import com.vmware.vim25.KeyValue;
import com.vmware.vim25.LicenseAssignmentManagerLicenseAssignment;
import com.vmware.vim25.LicenseManagerLicenseInfo;
import com.vmware.vim25.ManagedObjectReference;

import com.cloud.hypervisor.vmware.util.VmwareContext;

public class LicenseAssignmentManagerMO extends BaseMO {

    private static final Logger s_logger = Logger.getLogger(LicenseAssignmentManagerMO.class);
    private static final String LICENSE_INFO_PRODUCT_VERSION = "ProductVersion";
    private static final String LICENSE_INFO_PRODUCT_NAME = "ProductName";
    private static final String LICENSE_INFO_NAME = "Name";
    private static final String LICENSE_INFO_FEATURE = "feature";

    public LicenseAssignmentManagerMO(VmwareContext context, ManagedObjectReference mor) {
        super(context, mor);
    }

    public LicenseAssignmentManagerMO(VmwareContext context, String morType, String morValue) {
        super(context, morType, morValue);
    }

    public LicenseAssignmentManagerLicenseAssignment getAssignedLicenseToHost(ManagedObjectReference hostMor) throws Exception {
        List<LicenseAssignmentManagerLicenseAssignment> licenses = _context.getVimClient().getService().queryAssignedLicenses(_mor, hostMor.getValue());
        return licenses.get(0);
    }

    public boolean isFeatureSupported(String featureKey, ManagedObjectReference hostMor) throws Exception {
        boolean featureSupported = false;

        // Retrieve host license properties
        List<KeyAnyValue> props = getHostLicenseProperties(hostMor);

        // Check host license properties to see if specified feature is supported by the license.
        for (KeyAnyValue prop : props) {
            String key = prop.getKey();
            if (key.equalsIgnoreCase(LICENSE_INFO_FEATURE)) {
                KeyValue propValue = (KeyValue)prop.getValue();
                if (propValue.getKey().equalsIgnoreCase(featureKey)) {
                    featureSupported = true;
                    break;
                }
            }
        }

        return featureSupported;
    }

    public LicenseManagerLicenseInfo getHostLicenseInfo(ManagedObjectReference hostMor) throws Exception {
        // Retrieve license assigned to specified host
        LicenseAssignmentManagerLicenseAssignment license = getAssignedLicenseToHost(hostMor);
        return license.getAssignedLicense();
    }

    public List<KeyAnyValue> getHostLicenseProperties(ManagedObjectReference hostMor) throws Exception {
        return getHostLicenseInfo(hostMor).getProperties();
    }

    public String getHostLicenseName(ManagedObjectReference hostMor) throws Exception {
        return getHostLicenseInfo(hostMor).getName();
    }

}
