// Copyright (C) The Arvados Authors. All rights reserved.
//
// SPDX-License-Identifier: AGPL-3.0

import React from 'react';
import { WorkflowResource } from "models/workflow";
import { WorkflowFactory } from "cwlts/models";
import * as yaml from 'js-yaml';
import "lib/cwl-svg/assets/styles/themes/rabix-dark/theme.css";
import "lib/cwl-svg/plugins/port-drag/theme.dark.css";
import "lib/cwl-svg/plugins/selection/theme.dark.css";
import {
    SelectionPlugin,
    SVGArrangePlugin,
    SVGEdgeHoverPlugin,
    SVGNodeMovePlugin,
    SVGPortDragPlugin, Workflow,
    ZoomPlugin
} from "lib/cwl-svg";

interface WorkflowGraphProps {
    workflow: WorkflowResource;
}
export class WorkflowGraph extends React.Component<WorkflowGraphProps, {}> {
    private svgRoot: React.RefObject<SVGSVGElement> = React.createRef();

    setGraph() {
        const graphs = yaml.safeLoad(this.props.workflow.definition, { json: true });

        let workflowGraph = graphs;
        if (graphs.$graph) {
          workflowGraph = graphs.$graph.find((g: any) => g.class === 'Workflow');
        }

        const model = WorkflowFactory.from(workflowGraph);

        const workflow = new Workflow({
            model,
            svgRoot: this.svgRoot.current!,
            plugins: [
                new SVGArrangePlugin(),
                new SVGEdgeHoverPlugin(),
                new SVGNodeMovePlugin({
                    movementSpeed: 2
                }),
                new SVGPortDragPlugin(),
                new SelectionPlugin(),
                new ZoomPlugin(),
            ]
        });
        workflow.draw();
    }

    componentDidMount() {
        this.setGraph();
    }

    componentDidUpdate() {
        this.setGraph();
    }

    render() {
        return <svg
            ref={this.svgRoot}
            className="cwl-workflow"
            style={{
                width: '100%',
                height: '100%'
            }}
        />;
    }
}
