import { merge } from 'lodash-es'
import * as EchartsHelper from './inject'
import { loadEchartsLibs } from '@/components/Echarts/src/tools'

// 全局注入工具函数
window.EchartsHelper = EchartsHelper

export default {
    data() {
        return {
            option: {},
        }
    },
    methods: {
        loadLibs: loadEchartsLibs,
        init() {
            // 如果已经初始化过了，就直接更新配置项
            if (this.chart && this.chart.setOption) {
                this.chart.setOption(this.option)
                return
            }

            // 初始化组件
            const chart = window.echarts.init(document.getElementById(this.option.id))
            // 设置图表配置项
            chart.setOption(this.option)
            this.chart = chart
        },
        changeOption(option) {
            if (!option?.id) {
                return
            }

            // 处理tooltip formatter函数序列化问题
            if (option.tooltip && option.tooltip.formatter) {
                const formatterStr = option.tooltip.formatter
                if (typeof formatterStr === 'string') {
                    try {
                        // 使用eval在视图层重新构建函数
                        // 支持箭头函数和普通函数
                        option.tooltip.formatter = eval('(' + formatterStr + ')')
                    } catch (e) {
                        // renderjs视图层不支持console，静默处理错误
                    }
                }
            }

            this.option = merge(this.option, option)
            if (typeof window.echarts === 'object' && typeof window.echarts.init === 'function') {
                this.init()
            } else {
                this.loadLibs().then(() => {
                    this.init()
                })
            }
        },
        // 添加update方法，在这里重新定义tooltip的formatter
        update() {
            // 确保图表实例存在
            if (this.chart) {
                // 重新设置option，确保tooltip formatter正确绑定
                if (this.option && this.option.tooltip && typeof this.option.tooltip.formatter === 'function') {
                    // 重新绑定formatter函数
                    this.chart.setOption(this.option, true);
                }
            }
        }
    },
}