/*
 * Copyright (c) 2017 CEA.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    CEA - initial API and implementation
 */
package org.eclipse.sensinact.gateway.generic.parser;

import org.eclipse.sensinact.gateway.api.core.Resource;
import org.eclipse.sensinact.gateway.common.bundle.Mediator;
import org.xml.sax.Attributes;

/**
 * The extended {@link Resource} interface type of a {@link PolicyDefinition}
 *
 * @author <a href="mailto:christophe.munilla@cea.fr">Christophe Munilla</a>
 */
@XmlElement(tag = "interfaceName", field = "resourceInterfaceType")
final class ResourceInterfaceDefinition extends XmlModelParsingContext {
    private Class<? extends Resource> resourceInterfaceType;

    /**
     * Constructor
     *
     * @param mediator the associated Mediator
     * @param atts     the set of attributes data structure for the
     *                 xml identifier element
     */
    public ResourceInterfaceDefinition(Mediator mediator, Attributes atts) {
        super(mediator, atts);
    }

    /**
     * Defines the name of the extended {@link Resource} interface
     * type wrapped by this ResourceInterfaceDefinition
     *
     * @param interfaceName the extended {@link Resource} interface type
     *                      name
     */
    @SuppressWarnings("unchecked")
    void setResourceInterfaceType(String interfaceName) {
        if(interfaceName == null || interfaceName.length()==0) {
        	return;
        }
    	this.resourceInterfaceType = (Class<? extends Resource>) this.resolveInterfaceType(interfaceName);
        if (resourceInterfaceType != null) {
            return;
        }        
        try {
            this.resourceInterfaceType = (Class<? extends Resource>) super.mediator.getContext().getBundle().loadClass(interfaceName);

            if (!this.resourceInterfaceType.isInterface()) {
                this.resourceInterfaceType = null;
            }
        } catch (ClassNotFoundException e) {
            super.mediator.error(e);
        }
    }

    private Class resolveInterfaceType(String interfaceName) {
		switch(interfaceName) {
    		case "org.eclipse.sensinact.gateway.api.core.StateVariableResource" :
    			return XmlResourceConfigHandler.DEFAULT_VARIABLE_INTERFACE;
    		case "org.eclipse.sensinact.gateway.api.core.SensorDataResource" :
    			return XmlResourceConfigHandler.DEFAULT_SENSOR_INTERFACE;
    		case "org.eclipse.sensinact.gateway.api.core.PropertyResource":
    			return XmlResourceConfigHandler.DEFAULT_PROPERTY_INTERFACE;
    		case "org.eclipse.sensinact.gateway.api.core.ActionResource":
    			return XmlResourceConfigHandler.DEFAULT_ACTION_INTERFACE;    		
	    }
        return null;
    }

    /**
     * Returns the extended {@link Resource} interface type
     * wrapped by this ResourceInterfaceDefinition
     */
    public Class<? extends Resource> getResourceInterfaceType() {
        return this.resourceInterfaceType;
    }
}
