/*
 * 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 org.apache.airavata.workflow.core.dag.nodes;

import org.apache.airavata.model.ComponentState;
import org.apache.airavata.model.ComponentStatus;
import org.apache.airavata.model.NodeModel;
import org.apache.airavata.model.PortModel;
import org.apache.airavata.model.application.io.DataType;
import org.apache.airavata.model.application.io.InputDataObjectType;
import org.apache.airavata.model.application.io.OutputDataObjectType;
import org.apache.airavata.workflow.core.dag.edge.Edge;
import org.apache.airavata.workflow.core.dag.port.OutPort;

import java.util.ArrayList;
import java.util.List;

public class InputNodeImpl implements InputNode {

    private NodeModel nodeModel;
    private InputDataObjectType inputDataObjectType;
    private PortModel portModel;
    private List<Edge> edges = new ArrayList<>();
    private String value;
    private DataType dataType;
    private String description, name, id;


    public InputNodeImpl() {
    }

    @Override
    public void setNodeModel(NodeModel nodeModel) {
        this.nodeModel = nodeModel;
        setPortModel(convert(nodeModel));
    }

    @Override
    public NodeModel getNodeModel() {
        return nodeModel;
    }

    @Override
    public void setId(String nodeId) {
        this.id = nodeId;
    }

    @Override
    public String getId() {
        return id;
    }

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

    @Override
    public String getName() {
        return name;
    }

    @Override
    public NodeType getType() {
        return NodeType.WORKFLOW_INPUT;
    }

    @Override
    public ComponentState getState() {
        return getStatus().getState();
    }

    @Override
    public ComponentStatus getStatus() {
        return getNodeModel().getStatus();
    }

    @Override
    public void setStatus(ComponentStatus newStatus) {
        getNodeModel().setStatus(newStatus);
    }

    @Override
    public void setPortModel(PortModel portModel) {
        this.portModel = portModel;
    }

    @Override
    public PortModel getPortModel() {
        return portModel;
    }

    @Override
    public boolean isReady() {
        return (inputDataObjectType.getValue() != null && !inputDataObjectType.getValue().equals(""))
                || !inputDataObjectType.isIsRequired();
    }

    @Override
    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String getDescription() {
        return description;
    }

    @Override
    public WorkflowNode getNode() {
        return this;
    }

    @Override
    public void setNode(WorkflowNode workflowNode) {
        // InputNode itself a workflowNode
    }

    @Override
    public InputDataObjectType getInputObject() {
        if (inputDataObjectType == null) {
            inputDataObjectType = new InputDataObjectType(getName());
            inputDataObjectType.setValue(getValue());
            inputDataObjectType.setType(getDataType());
//            inputDataObjectType.setIsRequired(true);
//            inputDataObjectType.setDataStaged(true);
//            inputDataObjectType.setInputOrder(0);
        }
        return inputDataObjectType;
    }

    @Override
    public void setInputObject(InputDataObjectType inputObject) {
        this.inputDataObjectType = inputObject;
    }

    @Override
    public OutPort getOutPort() {
        return this;
    }

    @Override
    public void setOutPort(OutPort outPort) {
        // InputNode is a outPort
    }

    @Override
    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public DataType getDataType() {
        return dataType;
    }

    @Override
    public void setDataType(DataType dataType) {
        this.dataType = dataType;
    }

    @Override
    public String getNodeId() {
        return getNode().getId();
    }

    @Override
    public void setNodeId(String nodeId) {

    }

    @Override
    public String getValue() {
        return value;
    }

    @Override
    public void setOutputObject(OutputDataObjectType outputObject) {

    }


    @Override
    public OutputDataObjectType getOutputObject() {
        return convert(getInputObject());
    }

    @Override
    public List<Edge> getEdges() {
        return edges;
    }

    @Override
    public void addEdge(Edge edge) {
        edges.add(edge);
    }

    private PortModel convert(NodeModel nodeModel) {
        PortModel portModel = new PortModel(nodeModel.getNodeId());
        portModel.setName(nodeModel.getName());
        portModel.setDescription(nodeModel.getDescription());
        return portModel;
    }

    private OutputDataObjectType convert(InputDataObjectType inputObject) {
        OutputDataObjectType output = new OutputDataObjectType(inputObject.getName());
        output.setType(inputObject.getType());
        output.setValue(inputObject.getValue());
        output.setIsRequired(inputObject.isIsRequired());
        output.setApplicationArgument(inputObject.getApplicationArgument());
        output.setOutputStreaming(false);
//        output.setDataMovement(true);
        return output;
    }
}
