import { GraphModel, h, CircleNode, CircleNodeModel, ConnectRule } from "@logicflow/core";
import { ColorEnum, NodeStateEnum } from "../types/enums";

class EndModel extends CircleNodeModel {
  constructor(data: any, graphModel: GraphModel) {
    super(data, graphModel);
  }

  setAttributes(): void {
    this.r = 20;
    if((this.text && this.text.value == "") || !this.text) {
      this.text.value = "结束";
    }
    this.text.draggable = false;
    this.text.editable = false;

    if (this.properties._width) {
      this.r = this.properties._width / 2;
    }
    if (this.properties._stroke) {
      this.properties.stroke = this.properties._stroke;
    }
    if (this.properties._fill) {
      this.properties.fill = this.properties._fill;
    }
    if (this.properties._strokeWidth) {
      this.properties.strokeWidth = this.properties._strokeWidth;
    }
    if (this.properties._opacity) {
      this.properties.opacity = this.properties._opacity;
    }
  }

  getConnectedSourceRules(): ConnectRule[] {
    const rules = super.getConnectedSourceRules();
    rules.push({
      message: "结束节点不能是边的源节点",
      validate: () => false
    });
    return rules;
  }

  getNodeStyle() {
    const style = super.getNodeStyle();
    const state = this.properties.state;

    if(state === NodeStateEnum.history) {
      style.stroke = ColorEnum.historyColor;
      style.fill = `${ColorEnum.historyColor}10`;
    } else if(state === NodeStateEnum.active) {
      style.stroke = ColorEnum.activeColor;
      style.fill = `${ColorEnum.activeColor}10`;
    } else if(state === NodeStateEnum.error) {
      style.stroke = ColorEnum.errorColor;
      style.fill = `${ColorEnum.errorColor}10`;
    } else {
      style.stroke = ColorEnum.errorColor;
      style.fill = `${ColorEnum.errorColor}10`;
    }

    if (this.properties._stroke) {
      style.stroke = this.properties._stroke;
    }
    if (this.properties._fill) {
      style.fill = this.properties._fill;
    }
    if (this.properties._strokeWidth) {
      style.strokeWidth = this.properties._strokeWidth;
    }
    if (this.properties._opacity !== undefined) {
      style.opacity = this.properties._opacity;
    }

    return style;
  }
}

class EndView extends CircleNode {
  private getEndIcon() {
    const { model } = this.props;
    const { x, y } = model;
    const style = model.getNodeStyle();
    const iconSize = 16;

    return h("circle", {
      cx: x,
      cy: y,
      r: iconSize / 2,
      fill: style.stroke,
      stroke: "none"
    });
  }

  getResizeShape() {
    const { model } = this.props;
    const { x, y, r } = model;
    const style = model.getNodeStyle();
    return h("g", {}, [
      h("circle", {
        ...style,
        cx: x,
        cy: y,
        r
      }),
      this.getEndIcon()
    ]);
  }

  getShape() {
    return this.getResizeShape();
  }
}

export default {
  type: "end",
  view: EndView,
  model: EndModel,
};
