@startuml process_branches

actor       oc_scheduler    as oc
participant graph           as graph
participant argoBuilder     as argo
entity      list_branches   as branches
entity      graph           as argoGraph


oc -> graph     :   loadGraphFrom(nom_workflow)
activate oc
activate graph

graph --> oc    :   Graph

oc -> graph     :   generateArgo()

graph -> graph  :   createBranches

graph -> argo   :   new ArgoBuilder(Graph,list_branches)
activate argo

argo -> argo    :   create list of nodes already written
note top  :  a node is a component in a link object,\n represented by its ID 

argo -> argo
note bottom : We want to prepare the list of branches by removing\n nodes that appears several times\ne.g : two branches :\n1 - 2 2 - 3 3 - 4\n1 - 2 2 - 3 3 - 5\nWe will iterate over each branch to create the component's YAML\n and don't want to create components 1 2 et 3 twice or more

loop computing in graph.computings
    argo -> argo        :   create new container object
    argo -> argoGraph   :   retrieve image name
    argo -> argoGraph   :   add command from the computing component
    argo -> argoGraph   :   add arguments from the computing component
    
    argo -> argoGraph   :   retrieve environment variables' name from the computing component
    argo -> argo        :   create a new list of Parameter 
    loop env variable in retrieved env variables
        argo -> argo    :   add a Parameter object to the list with only the name attribute
        end
    
    argo -> argo        :   create a Template object from the name of the component and the Container object
    argo -> argo        :   add attached volume (currently we share the same mounted volume)
    argo -> argo        :   append the new Template 
    end

argo -> argo    :   create new Dag object

loop computing in graph.computings
    argo -> argo        :   create a new Task
    argo -> argoGraph   :   add a unique name from the component name and ID in the graph
    argo -> argoGraph   :   add the name of the associated Template
    argo -> argoGraph   :   add the list of environment variables from the component
    
    loop branch in branches
        group if component is in the branch

            argo -> argo    : add the previous component name to the list of dependencies

            end
        end
    
    argo -> argo    :   add the task/step to the list of Tasks
    
    end

argo -> argo    :   add new Template named DAG to the Templates

loop storage in graph.storages
    argo -> argo        :   create a new VolumeClaimTemplate object
    argo -> argoGraph   :   add name from the storage component
    argo -> argoGraph   :   add access mode from the storage component
    argo -> argoGraph   :   add storage capacity from the storage component
    
    end

loop data in graph.data
    argo -> argo        :
    end

argo -> argo    :   marshal the Workflow to yaml
argo -> argo    :   write the marshaled object to a .yml file

@enduml