package eu.dnetlib.espas.jdbc.configuration;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import java.util.ArrayList;
import java.util.List;

public class Query {

    private String resourceType = null;
    private String queryType = null;
    private String database = null;

    private List<Template> templates = new ArrayList<Template>();
    private List<Statement> statements = new ArrayList<Statement>();
    private List<InputParameter> inputParameters = new ArrayList<InputParameter>();
    private List<OutputParameter> outputParameters = new ArrayList<OutputParameter>();

    public Query() {
    }

    @SuppressWarnings("UnusedDeclaration")
    public Query(String resourceType,
                 String queryType,
                 String template,
                 String database,
                 List<Template> templates,
                 List<Statement> statements,
                 List<InputParameter> inputParameters,
                 List<OutputParameter> outputParameters) {
        super();
        this.resourceType = resourceType;
        this.queryType = queryType;
        this.database = database;
        this.templates = templates;
        this.statements = statements;
        this.inputParameters = inputParameters;
        this.outputParameters = outputParameters;
    }

    @XmlAttribute(required = true)
    public String getResourceType() {
        return this.resourceType;
    }

    public void setResourceType(String resourceType) {
        this.resourceType = resourceType;
    }

    @XmlAttribute(required = true)
    public String getQueryType() {
        return this.queryType;
    }

    public void setQueryType(String queryType) {
        this.queryType = queryType;
    }

    @XmlAttribute(required = true)
    public String getDatabase() {
        return database;
    }

    public void setDatabase(String database) {
        this.database = database;
    }

    @XmlElementWrapper(name = "templates")
    @XmlElement(name = "template")
    public List<Template> getTemplates() {
        return templates;
    }

    public Template getTemplate(String name) {
        for (Template template : templates)
            if (template.getName().equalsIgnoreCase(name))
                return template;
        return null;
    }

    @XmlElementWrapper(name = "statements")
    @XmlElement(name = "statement")
    public List<Statement> getStatements() {
        return statements;
    }

    public Statement getStatement(String name) {
        for (Statement statement : statements)
            if (statement.getName().equalsIgnoreCase(name))
                return statement;
        return null;
    }

    public Statement getParentStatement() {
        for (Statement statement : statements)
            if (statement.getParent() != null && statement.getParent())
                return statement;
        return null;
    }

    @XmlElementWrapper(name = "input")
    @XmlElement(name = "parameter")
    public List<InputParameter> getInputParameters() {
        return inputParameters;
    }

    @SuppressWarnings("UnusedDeclaration")
    public void setInputParameters(List<InputParameter> inputParameters) {
        this.inputParameters = inputParameters;
    }

    @XmlElementWrapper(name = "output")
    @XmlElement(name = "parameter")
    public List<OutputParameter> getOutputParameters() {
        return this.outputParameters;
    }

    @SuppressWarnings("UnusedDeclaration")
    public void setOutputParameters(List<OutputParameter> outputParameters) {
        this.outputParameters = outputParameters;
    }

    public InputParameter getInputParameter(String type) {

        for (InputParameter param : inputParameters) {
            if (param.getName().equals(type))
                return param;
        }

        return null;
    }

    public OutputParameter getOutputParameter(String name) {
        for (OutputParameter param : outputParameters) {
            if (param.getName().equalsIgnoreCase(name))
                return param;
        }
        return null;
    }

    @SuppressWarnings("UnusedDeclaration")
    public OutputParameter getOutputParameter(String parent, String name) {

        OutputParameter parameter = null;

        for (OutputParameter param : outputParameters) {
            if (param.getName().equalsIgnoreCase(parent)) {
                parameter = param.getOutputParameter(name);
            }
        }

        if (parameter != null)
            return parameter;
        else {
            for (OutputParameter param : outputParameters) {
                if (!param.getName().equalsIgnoreCase(parent))
                    parameter = param.getOutputParameter(parent, name);
            }
        }
        return parameter;

    }
}
