/**
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 *
 * Copyright (C)
 * <a href="http://www.inab.org">Spanish National Institute of Bioinformatics (INB)</a>
 * <a href="http://www.bsc.es">Barcelona Supercomputing Center (BSC)</a>
 * <a href="http://inb.bsc.es">Computational Node 6</a>
 */

package org.inb.biomoby.shared.registry;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlEnumValue;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * @author Dmitry Repchevsky
 */

@XmlRootElement(name="service")
public class Service extends AbstractEntity<Service> implements Serializable, Cloneable
{
    public static enum CATEGORY {moby, @XmlEnumValue("moby-async") moby_async, @XmlEnumValue("doc-literal") doc_literal, @XmlEnumValue("doc-literal-async") doc_literal_async, soap, cgi, wsdl, post};
    
    private CATEGORY category;
    private ServiceType serviceType;
    
    private boolean authoritative;
    
    private String url;
    private String signatureURL;
    
    private Input input;
    private Output output;
    
    private ArrayList<Parameter> secondaryArticles;
    
    public Service() {}
    
    public Service(String name, String authURI)
    {
        super(name, authURI);
    }
    
    @XmlAttribute
    public CATEGORY getCategory()
    {
        return category;
    }
    
    public void setCategory(CATEGORY category)
    {
        this.category = category;
    }
    
    @XmlElement(name="service_type")
    public ServiceType getServiceType()
    {
        return serviceType;
    }
    
    public void setServiceType(ServiceType serviceType)
    {
        this.serviceType = serviceType;
    }
    
    @XmlAttribute
    public boolean isAuthoritative()
    {
        return authoritative;
    }
    
    public void setAuthoritative(boolean authoritative)
    {
        this.authoritative = authoritative;
    }
    
    @XmlAttribute
    public String getUrl()
    {
        return url;
    }
    
    public void setUrl(String url)
    {
        this.url = url;
    }
    
    @XmlAttribute(name="signature_url")
    public String getSignatureURL()
    {
        return signatureURL;
    }
    
    public void setSignatureURL(String signatureURL)
    {
        this.signatureURL = signatureURL;
    }
    
    @XmlElement(name="input")
    public Input getInput()
    {
        return input;
    }
    
    public void setInput(Input input)
    {
        this.input = input;
    }

    @XmlElement(name="output")
    public Output getOutput()
    {
        return output;
    }
    
    public void setOutput(Output output)
    {
        this.output = output;
    }

    public void addSecondaryArticle(Parameter parameter)
    {
        getSecondaryArticles().add(parameter);
    }

    @XmlElement(name="parameter")
    public List<Parameter> getSecondaryArticles()
    {
        if (secondaryArticles == null)
        {
            secondaryArticles = new ArrayList<Parameter>();
        }
        
        return secondaryArticles;
    }

    @Override
    public Service clone()
    {
        Service clone = (Service)super.clone();

        // TODO
        if (serviceType != null)
        {
            clone.serviceType = serviceType.clone();
        }

        if (input != null)
        {
            clone.input = input.clone();
        }

        if (output != null)
        {
            clone.output = output.clone();
        }

        if (secondaryArticles != null)
        {
            clone.secondaryArticles = (ArrayList<Parameter>) secondaryArticles.clone();
            for (int i = 0, n = clone.secondaryArticles.size(); i < n; i++)
            {
                Parameter parameter = clone.secondaryArticles.get(i);
                clone.secondaryArticles.set(i, parameter.clone());
            }
        }
        
        return clone;
    }
}
