import { Dom, Graph, Node } from '@antv/x6'
import {
  conveyor,
  direction,
  one_track,
  pallet,
  rgv,
  stacker,
  storage,
  two_track
} from './images'
import { basicPorts, customPorts } from './ports'

export const SRM = Graph.registerNode('SRM', {
  inherit: 'image',
  width: 40,
  height: 40,
  attrs: {
    image: {
      'xlink:href': stacker,
      height: 40,
      x: 0,
      y: 0,
      preserveAspectRatio: 'none',
      'vector-effect': 'non-scaling-stroke'
    },
    imagePallet: {
      'xlink:href': pallet,
      height: 40,
      width: 40,
      class: 'hide-pallet',
      preserveAspectRatio: 'none',
      'vector-effect': 'non-scaling-stroke'
    },
    body: {
      // stroke: '#5F95FF',
      stroke: '#FF0000',
      strokeWidth: 3,
      fill: 'rgba(95,149,255,0.0001)',
      // fill: 'rgba(255,0,0,1)',
      height: 0,
      width: 0,
      class: 'flash-shrink-animation-close'
    },
    textCode: {
      class: 'animate-text1',
      text: '',
      fontSize: 8,
      fill: '#000000',
      stroke: '#000000',
      strokeWidth: 1,
      x: 0,
      y: -5
    }
    // text: {
    //   stroke: '#FF0000',
    //   strokeWidth: 1,
    //   class: 'animate-text1',
    //   text: '堆垛机',
    //   fontSize: 12,
    //   fill: '#FF0000',
    //   fillOpacity: 0.8,
    //   background: {
    //     fill: '#FFFF00',
    //   }
    // }
  },
  markup: [
    {
      tagName: 'image',
      selector: 'image'
    },
    {
      tagName: 'image',
      selector: 'imagePallet'
    },
    {
      tagName: 'rect',
      selector: 'body'
    },
    {
      tagName: 'text',
      selector: 'textCode'
    }
  ]
})

export const RGV = Graph.registerNode('RGV', {
  inherit: 'image',
  width: 40,
  height: 40,
  attrs: {
    image: {
      'xlink:href': rgv,
      height: 40,
      x: 0,
      y: 0,
      preserveAspectRatio: 'none',
      'vector-effect': 'non-scaling-stroke'
    },
    imagePallet: {
      'xlink:href': pallet,
      height: 40,
      width: 40,
      class: 'hide-pallet',
      preserveAspectRatio: 'none',
      'vector-effect': 'non-scaling-stroke'
    },
    body: {
      stroke: '#FF0000',
      strokeWidth: 3,
      fill: 'rgba(95,149,255,0.0001)',
      height: 0,
      width: 0,
      class: 'flash-shrink-animation-close'
    },
    textCode: {
      class: 'animate-text1',
      text: '',
      fontSize: 8,
      fill: '#000000',
      stroke: '#000000',
      strokeWidth: 1,
      x: 5,
      y: 20
    }
  },
  markup: [
    {
      tagName: 'image',
      selector: 'image'
    },
    {
      tagName: 'image',
      selector: 'imagePallet'
    },
    {
      tagName: 'rect',
      selector: 'body'
    },
    {
      tagName: 'text',
      selector: 'textCode'
    }
  ]
})

export const Station = Graph.registerNode('Station', {
  inherit: 'image',
  width: 60,
  height: 60,
  attrs: {
    image: {
      'xlink:href': conveyor,
      height: 60,
      x: 0,
      y: 0,
      preserveAspectRatio: 'none',
      'vector-effect': 'non-scaling-stroke'
    },
    imagePallet: {
      'xlink:href': pallet,
      height: 40,
      width: 40,
      class: 'hide-pallet',
      preserveAspectRatio: 'none',
      'vector-effect': 'non-scaling-stroke'
    },
    body: {
      stroke: '#FF0000',
      strokeWidth: 3,
      fill: 'rgba(95,149,255,0.0001)',
      height: 0,
      width: 0,
      class: 'flash-shrink-animation-close'
    },
    text: {
      class: 'animate-text1',
      fontSize: 12,
      // fill: '#5F95FF',
      // fill: '#0000FF',
      fill: '#5F95FF'
    },
    textCode: {
      class: 'animate-text1',
      text: '',
      fontSize: 8,
      fill: '#000000',
      stroke: '#000000',
      strokeWidth: 1,
      x: 15,
      y: 20
    }
  },
  markup: [
    {
      tagName: 'image',
      selector: 'image'
    },
    {
      tagName: 'image',
      selector: 'imagePallet'
    },
    {
      tagName: 'rect',
      selector: 'body'
    },
    {
      tagName: 'rect',
      selector: 'textBackground'
    },
    {
      tagName: 'text',
      selector: 'text'
    },
    {
      tagName: 'text',
      selector: 'textCode'
    }
  ]
})

export const Station_D = Graph.registerNode('Station-D', {
  inherit: 'image',
  width: 60,
  height: 60,
  attrs: {
    image: {
      'xlink:href': direction,
      height: 60,
      x: 0,
      y: 0,
      preserveAspectRatio: 'none',
      'vector-effect': 'non-scaling-stroke'
    },
    imagePallet: {
      'xlink:href': pallet,
      height: 40,
      width: 40,
      class: 'hide-pallet',
      preserveAspectRatio: 'none',
      'vector-effect': 'non-scaling-stroke'
    },
    body: {
      stroke: '#FF0000',
      strokeWidth: 3,
      fill: 'rgba(95,149,255,0.0001)',
      height: 0,
      width: 0,
      class: 'flash-shrink-animation-close'
    },
    text: {
      class: 'animate-text1',
      text: '',
      fontSize: 12,
      // fill: '#5F95FF',
      // fill: '#0000FF',
      fill: '#5F95FF'
    },
    textCode: {
      class: 'animate-text1',
      text: '',
      fontSize: 8,
      fill: '#000000',
      stroke: '#000000',
      strokeWidth: 1,
      x: 2,
      y: 20
    }
  },
  markup: [
    {
      tagName: 'image',
      selector: 'image'
    },
    {
      tagName: 'image',
      selector: 'imagePallet'
    },
    {
      tagName: 'rect',
      selector: 'body'
    },
    {
      tagName: 'text',
      selector: 'text'
    },
    {
      tagName: 'text',
      selector: 'textCode'
    }
  ]
})

export const Storage = Graph.registerNode('Storage', {
  inherit: 'image',
  width: 60,
  height: 60,
  attrs: {
    image: {
      'xlink:href': storage,
      height: 60,
      x: 0,
      y: 0,
      preserveAspectRatio: 'none',
      'vector-effect': 'non-scaling-stroke'
    },
    body: {
      stroke: '#5F95FF',
      strokeWidth: 1,
      fill: 'rgba(95,149,255,0.05)',
      height: 30,
      width: 30
    },
    text: {
      class: 'animate-text1',
      text: '1',
      fontSize: 12,
      fill: '#5F95FF'
      // fill: '#0000FF',
    }
  },
  markup: [
    {
      tagName: 'image',
      selector: 'image'
    },
    {
      tagName: 'rect',
      selector: 'body'
    },
    {
      tagName: 'text',
      selector: 'text'
    }
  ]
})

export const OneTrack = Graph.registerNode('OneTrack', {
  inherit: 'image',
  width: 40,
  height: 40,
  attrs: {
    image: {
      'xlink:href': one_track,
      height: 40,
      x: 0,
      y: 0,
      preserveAspectRatio: 'none',
      'vector-effect': 'non-scaling-stroke'
    }
  },
  markup: [
    {
      tagName: 'image',
      selector: 'image'
    }
  ]
})

export const TwoTrack = Graph.registerNode('TwoTrack', {
  inherit: 'image',
  width: 40,
  height: 40,
  attrs: {
    image: {
      'xlink:href': two_track,
      height: 40,
      x: 0,
      y: 0,
      preserveAspectRatio: 'none',
      'vector-effect': 'non-scaling-stroke'
    }
  },
  markup: [
    {
      tagName: 'image',
      selector: 'image'
    }
  ]
})

// 基础节点
export const FlowChartRect = Graph.registerNode('flow-chart-rect', {
  inherit: 'rect',
  width: 80,
  height: 42,
  attrs: {
    body: {
      stroke: '#5F95FF',
      strokeWidth: 1,
      fill: '#ffffff'
    },
    fo: {
      refWidth: '100%',
      refHeight: '100%'
    },
    foBody: {
      xmlns: Dom.ns.xhtml,
      style: {
        width: '100%',
        height: '100%',
        display: 'flex',
        justifyContent: 'center',
        alignItems: 'center'
      }
    },
    'edit-text': {
      contenteditable: 'true',
      class: 'x6-edit-text',
      style: {
        width: '100%',
        textAlign: 'center',
        fontSize: 12,
        color: 'rgba(0,0,0,0.85)'
      }
    },
    text: {
      fontSize: 12,
      fill: '#080808'
    }
  },
  markup: [
    {
      tagName: 'rect',
      selector: 'body'
    },
    {
      tagName: 'text',
      selector: 'text'
    }
    // 不让双击编辑文本
    // {
    //   tagName: 'foreignObject',
    //   selector: 'fo',
    //   children: [
    //     {
    //       ns: Dom.ns.xhtml,
    //       tagName: 'body',
    //       selector: 'foBody',
    //       children: [
    //         {
    //           tagName: 'div',
    //           selector: 'edit-text'
    //         }
    //       ]
    //     }
    //   ]
    // }
  ],
  ports: { ...basicPorts }
})
// 组合节点
export const FlowChartImageRect = Graph.registerNode('flow-chart-image-rect', {
  inherit: 'rect',
  width: 200,
  height: 60,
  attrs: {
    body: {
      stroke: '#5F95FF',
      strokeWidth: 1,
      fill: 'rgba(95,149,255,0.05)'
    },
    image: {
      'xlink:href':
        'https://gw.alipayobjects.com/zos/antfincdn/FLrTNDvlna/antv.png',
      width: 16,
      height: 16,
      x: 12,
      y: 12
    },
    title: {
      text: 'Node',
      refX: 40,
      refY: 14,
      fill: 'rgba(0,0,0,0.85)',
      fontSize: 12,
      'text-anchor': 'start'
    },
    text: {
      text: 'this is content text',
      refX: 40,
      refY: 38,
      fontSize: 12,
      fill: 'rgba(0,0,0,0.6)',
      'text-anchor': 'start'
    }
  },
  markup: [
    {
      tagName: 'rect',
      selector: 'body'
    },
    {
      tagName: 'image',
      selector: 'image'
    },
    {
      tagName: 'text',
      selector: 'title'
    },
    {
      tagName: 'text',
      selector: 'text'
    }
  ],
  ports: { ...basicPorts }
})

export const FlowChartTitleRect = Graph.registerNode('flow-chart-title-rect', {
  inherit: 'rect',
  width: 200,
  height: 68,
  attrs: {
    body: {
      stroke: '#5F95FF',
      strokeWidth: 1,
      fill: 'rgba(95,149,255,0.05)'
    },
    head: {
      refWidth: '100%',
      stroke: 'transparent',
      height: 28,
      fill: 'rgb(95,149,255)'
    },
    image: {
      'xlink:href':
        'data:image/png;base64,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',
      height: 16,
      x: 6,
      y: 6
    },
    title: {
      text: 'Node',
      refX: 30,
      refY: 9,
      fill: '#ffffff',
      fontSize: 12,
      'text-anchor': 'start'
    },
    text: {
      text: 'this is content text',
      refX: 8,
      refY: 45,
      fontSize: 12,
      fill: 'rgba(0,0,0,0.6)',
      'text-anchor': 'start'
    }
  },
  markup: [
    {
      tagName: 'rect',
      selector: 'body'
    },
    {
      tagName: 'rect',
      selector: 'head'
    },
    {
      tagName: 'image',
      selector: 'image'
    },
    {
      tagName: 'text',
      selector: 'title'
    },
    {
      tagName: 'text',
      selector: 'text'
    }
  ],
  ports: { ...basicPorts }
})

export const FlowChartAnimateText = Graph.registerNode(
  'flow-chart-animate-text',
  {
    inherit: 'rect',
    width: 200,
    height: 60,
    attrs: {
      body: {
        stroke: '#5F95FF',
        strokeWidth: 1,
        fill: 'rgba(95,149,255,0.05)'
      },
      text1: {
        class: 'animate-text1',
        text: '|||||||||||||',
        fontSize: 50,
        fill: '#5F95FF'
      }
      // text2: {
      //   class: 'animate-text2',
      //   text: 'AntV X6',
      //   fontSize: 32
      // }
    },
    markup: [
      {
        tagName: 'rect',
        selector: 'body'
      },
      {
        tagName: 'text',
        selector: 'text1'
      }
      // {
      //   tagName: 'text',
      //   selector: 'text2'
      // }
    ]
  }
)

// 自定义 系统设计图
export const FlowChartImageRectCustom = Graph.registerNode(
  'flow-chart-image-rect-custom',
  {
    inherit: 'rect',
    width: 80,
    height: 80,
    markup: [
      {
        tagName: 'rect',
        selector: 'body'
      },
      {
        tagName: 'image'
      },
      {
        tagName: 'text',
        selector: 'label'
      }
    ],
    attrs: {
      body: {
        // 节点线的颜色
        stroke: 'transparent',
        // 背景填充色
        fill: 'transparent'
      },
      // 自定义图片
      image: {
        width: 60,
        height: 60,
        refX: 0,
        refY: 0
      },
      label: {
        refX: 3,
        refY: 2,
        textAnchor: 'left',
        textVerticalAnchor: 'top',
        fontSize: 12,
        fill: 'black'
      },
      'edit-text': {
        contenteditable: 'true',
        class: 'x6-edit-text',
        style: {
          width: '100%',
          textAlign: 'center',
          fontSize: 12,
          color: 'rgba(0,0,0,0.85)'
        }
      },
      text: {
        fontSize: 12,
        fill: '#080808'
      }
    },
    ports: { ...customPorts }
  }
)

// 节点组
export class NodeGroup extends Node {
  collapsed = true;

  postprocess() {
    this.toggleCollapse(true)
  }

  isCollapsed() {
    return this.collapsed
  }

  toggleCollapse(collapsed) {
    const target = collapsed == null ? !this.collapsed : collapsed
    if (target) {
      this.attr('buttonSign', { d: 'M 1 5 9 5 M 5 1 5 9' })
      this.resize(200, 40)
    } else {
      this.attr('buttonSign', { d: 'M 2 5 8 5' })
      this.resize(240, 240)
    }
    this.collapsed = target
  }
}

NodeGroup.config({
  shape: 'rect',
  markup: [
    {
      tagName: 'rect',
      selector: 'body'
    },
    {
      tagName: 'image',
      selector: 'image'
    },
    {
      tagName: 'text',
      selector: 'text'
    },
    {
      tagName: 'g',
      selector: 'buttonGroup',
      children: [
        {
          tagName: 'rect',
          selector: 'button',
          attrs: {
            'pointer-events': 'visiblePainted'
          }
        },
        {
          tagName: 'path',
          selector: 'buttonSign',
          attrs: {
            fill: 'none',
            'pointer-events': 'none'
          }
        }
      ]
    }
  ],
  attrs: {
    body: {
      refWidth: '100%',
      refHeight: '100%',
      strokeWidth: 1,
      fill: 'rgba(95,149,255,0.05)',
      stroke: '#5F95FF'
    },
    image: {
      'xlink:href':
        'https://gw.alipayobjects.com/mdn/rms_0b51a4/afts/img/A*X4e0TrDsEiIAAAAAAAAAAAAAARQnAQ',
      width: 16,
      height: 16,
      x: 8,
      y: 12
    },
    text: {
      fontSize: 12,
      fill: 'rgba(0,0,0,0.85)',
      refX: 30,
      refY: 15
    },
    buttonGroup: {
      refX: '100%',
      refX2: -25,
      refY: 13
    },
    button: {
      height: 14,
      width: 16,
      rx: 2,
      ry: 2,
      fill: '#f5f5f5',
      stroke: '#ccc',
      cursor: 'pointer',
      event: 'node:collapse'
    },
    buttonSign: {
      refX: 3,
      refY: 2,
      stroke: '#808080'
    }
  }
})

Graph.registerNode('groupNode', NodeGroup)