import {
  buildOption,
  getRenderNode,
  getRenderLink,
  getRenderIcon,
  getRenderLege,
  getTooltip,
  getMarkLine,
  setChartOption,
  setListeners,
  setRiverRgbaOpacity,
  lightUp,
  setRiverIconStyle,
  style,
  computeCanvasStyle,
  getContainerWidth,
  resizeListener
} from './index'
import { addResizeListener, removeResizeListener } from '@opentiny/utils'

export const api = ['state', 'lightUp', 'style']

export const renderless = (
  props,
  { computed, onMounted, onBeforeUnmount, reactive },
  { vm, emit, parent },
  { echarts }
) => {
  const state = reactive({
    myChart: null,
    markLineShow: false,
    lighting: [],
    nameInfo: null,
    styling: [],
    option: null,
    canvasStyle: computed(() => api.computeCanvasStyle()),
    canvasWidth: null,
    canvasTransformOrigin: 'left top',
    canvasTransform: null
  })

  const api = {
    state,
    getRenderLege: getRenderLege(),
    getTooltip: getTooltip(),
    getMarkLine: getMarkLine(),
    setChartOption: setChartOption(state),
    setRiverRgbaOpacity: setRiverRgbaOpacity({ props, state }),
    setRiverIconStyle: setRiverIconStyle(state),
    computeCanvasStyle: computeCanvasStyle({ props, state }),
    getContainerWidth: getContainerWidth(state),
    resizeListener: resizeListener({ props, state })
  }

  Object.assign(api, {
    buildOption: buildOption({ api, emit, props, state, vm }),
    getRenderNode: getRenderNode({ api, echarts }),
    getRenderLink: getRenderLink({ api, echarts }),
    getRenderIcon: getRenderIcon({ api }),
    setListeners: setListeners({ api, emit, state }),
    lightUp: lightUp({ api, state }),
    style: style({ api, state })
  })

  onMounted(() => {
    state.myChart = echarts.init(vm.$el)
    state.containerEl = parent.$parent.$el
    const option = (state.option = api.buildOption())

    api.setChartOption(option)
    api.setListeners(option)

    state.containerEl && addResizeListener(state.containerEl, api.resizeListener)
  })

  onBeforeUnmount(() => {
    state.myChart.off('mousemove')
    state.myChart.getZr().off('mousemove')
    state.myChart.off('click')

    state.myChart = null

    state.containerEl && removeResizeListener(state.containerEl, api.resizeListener)

    state.containerEl = null
  })

  return api
}