import {
  Component,
  OnInit,
  Input,
  ElementRef,
  AfterViewInit,
  ViewChild,
} from '@angular/core';

import * as shape from 'd3-shape';
import * as _ from 'lodash';

import { Workflow, Job } from '../shared/workflow.model';

@Component({
  selector: 'hi-workflow-dag',
  templateUrl: './workflow-dag.component.html',
  styleUrls: ['./workflow-dag.component.scss'],
})
export class WorkflowDagComponent implements OnInit, AfterViewInit {
  @Input()
  workflow: Workflow;
  curve: any = shape.curveLinear;
  view = [800, 600];
  data = {
    nodes: [],
    links: [],
  };
  jobNameToId = {};

  @ViewChild('graph', { static: true })
  graph;

  constructor(protected el: ElementRef) {}

  ngOnInit() {
    this.loadJobs();
  }

  ngAfterViewInit() {
    // console.log(this.el);
    // console.log(this.graph);
  }

  protected loadJobs() {
    // process nodes
    _.forEach(this.workflow.jobs, (job: Job) => {
      const newId = (this.data.nodes.length + 1).toString();

      this.data.nodes.push({
        id: newId,
        label: job.name,
        description: job.rawName,
        state: job.state,
      });
      this.jobNameToId[job.name] = newId;
    });

    // process edges/links
    _.forEach(this.workflow.jobs, (job: Job) => {
      _.forEach(job.parents, (parentName) => {
        this.data.links.push({
          source: this.jobNameToId[parentName],
          target: this.jobNameToId[job.name],
        });
      });
    });
  }
}
