package org.jboss.windup.rules.apps.javaee.model;

import org.jboss.windup.graph.model.resource.ReportResourceFileModel;
import org.jboss.windup.rules.apps.java.model.JavaClassModel;
import org.jboss.windup.rules.apps.xml.model.XmlFileModel;

import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.frames.Adjacency;
import com.tinkerpop.frames.Property;
import com.tinkerpop.frames.modules.typedgraph.TypeValue;

/**
 * Contains information regarding a JBPM 3 process model.
 */
@TypeValue(Jbpm3ProcessModel.TYPE)
public interface Jbpm3ProcessModel extends XmlFileModel
{
    String TYPE = "Jbpm3ProcessModel";
    String PROCESS_NAME = "processName";
    String STATE_COUNT = "stateCount";
    String NODE_COUNT = "nodeCount";
    String DECISION_COUNT = "decisionCount";
    String FORK_COUNT = "forkCount";
    String SUBPROCESS_COUNT = "subProcessCount";
    String TASK_COUNT = "taskCount";
    String ACTION_HANDLERS = "actionHandlers";
    String DECISION_HANDLERS = "decisionHandlers";

    /**
     * Contains the name of the process.
     */
    @Property(PROCESS_NAME)
    String getProcessName();

    /**
     * Contains the name of the process.
     */
    @Property(PROCESS_NAME)
    String setProcessName(String processName);

    /**
     * Contains a link to an image representing the process.
     */
    @Adjacency(label = ReportResourceFileModel.TYPE, direction = Direction.OUT)
    ReportResourceFileModel getProcessImage();

    /**
     * Contains a link to an image representing the process.
     */
    @Adjacency(label = ReportResourceFileModel.TYPE, direction = Direction.OUT)
    void setProcessImage(ReportResourceFileModel processImage);
    
    @Property(DECISION_COUNT)
    Integer getDecisionCount();

    @Property(DECISION_COUNT)
    Integer setDecisionCount(Integer decisionCount);
    
    @Property(STATE_COUNT)
    Integer getStateCount();

    @Property(STATE_COUNT)
    Integer setStateCount(Integer stateCount);
    
    @Property(NODE_COUNT)
    Integer getNodeCount();

    @Property(NODE_COUNT)
    Integer setNodeCount(Integer nodeCount);
    
    @Property(FORK_COUNT)
    Integer getForkCount();

    @Property(FORK_COUNT)
    Integer setForkCount(Integer forkCount);
    
    @Property(SUBPROCESS_COUNT)
    Integer getSubProcessCount();

    @Property(SUBPROCESS_COUNT)
    Integer setSubProcessCount(Integer subProcessCount);

    @Property(TASK_COUNT)
    Integer getTaskCount();

    @Property(TASK_COUNT)
    Integer setTaskCount(Integer taskCount);

    /**
     * Contains a list of action handlers used by this process.
     */
    @Adjacency(label = ACTION_HANDLERS, direction = Direction.OUT)
    void addActionHandler(final JavaClassModel javaClass);

    /**
     * Contains a list of action handlers used by this process.
     */
    @Adjacency(label = ACTION_HANDLERS, direction = Direction.OUT)
    Iterable<JavaClassModel> getActionHandlers();

    /**
     * Contains a list of decision handlers used by this process.
     */
    @Adjacency(label = DECISION_HANDLERS, direction = Direction.OUT)
    void addDecisionHandler(final JavaClassModel javaClass);

    /**
     * Contains a list of decision handlers used by this process.
     */
    @Adjacency(label = DECISION_HANDLERS, direction = Direction.OUT)
    Iterable<JavaClassModel> getDecisionHandlers();

}
