import { optionsInit, updateOptions } from './init.uts'
import { TouchPosition, ChartScrollOption } from './Interface.uts'
import { TuiChartConfig } from './config.uts'
import { TuiChartsEvent } from './chartsEvent.uts'
import { ChartOptionsTooltipOption, ChartOptions, ChartOptionsSeries, ChartOptionsTooltip, TextList, Offset, ChartOptionsXAxis, TuiChartsInterface } from './type.uts'
import { drawCharts, getTouches, Animation, findCandleChartCurrentIndex, getMixToolTipData, findMapChartCurrentIndex, getCandleToolTipData, findWordChartCurrentIndex, findFunnelChartCurrentIndex, findRadarChartCurrentIndex, findRoseChartCurrentIndex, findPieChartCurrentIndex, findCurrentIndex, getSeriesDataItem, getToolTipData, calYAxisData, getXAxisPoints, calValidDistance, findLegendIndex, findBarChartCurrentIndex } from './util.uts'
// ChartOptionsYAxis, ChartOptionsLegend, ChartOptionsExtra,
export class TuiDrawCharts implements TuiChartsInterface {
	opts : ChartOptions
	context : CanvasRenderingContext2D
	uevent : TuiChartsEvent = new TuiChartsEvent()
	config : TuiChartConfig
	scrollOption = new ChartScrollOption()
	animationInstance ?: Animation = null
	offsetWidth : number
	offsetHeight : number
	constructor(option : UTSJSONObject) {
		this.context = option['context'] as CanvasRenderingContext2D
		const _opts = optionsInit(option)
		const conf = new TuiChartConfig()
		this.offsetWidth = this.context.canvas.offsetWidth
		this.offsetHeight = this.context.canvas.offsetHeight
		conf.fontSize = _opts.fontSize * _opts.pixelRatio;
		if (_opts.color != null) conf.color = _opts.color!
		if (_opts.type == 'pie') {
			if (_opts.dataLabel == false) {
				conf.pieChartLinePadding = 0
			} else {
				conf.pieChartLinePadding = _opts.extra.pie!.labelWidth * _opts.pixelRatio
			}
		}
		if (_opts.type == 'ring') {
			if (_opts.dataLabel == false) {
				conf.pieChartLinePadding = 0
			} else {
				conf.pieChartLinePadding = _opts.extra.ring!.labelWidth * _opts.pixelRatio
			}
		}
		if (_opts.type == 'rose') {
			if (_opts.dataLabel == false) {
				conf.pieChartLinePadding = 0
			} else {
				conf.pieChartLinePadding = _opts.extra.rose!.labelWidth * _opts.pixelRatio
			}
		}
		if (_opts.dataLabel == false) {
			conf.pieChartTextPadding = 0
		} else {
			conf.pieChartTextPadding = conf.pieChartTextPadding * _opts.pixelRatio
		}
		conf.rotate = _opts.rotate;
		this.config = conf;
		this.opts = _opts
	}
	setCoordinates(e : UTSJSONObject) {
		if (e.getNumber('height') != null) this.opts.height = e.getNumber('height')!
		if (e.getNumber('width') != null) this.opts.width = e.getNumber('width')!
		if (e.getNumber('yOffset') != null) this.opts.yOffset = e.getNumber('yOffset')!
		if (e.getNumber('xOffset') != null) this.opts.xOffset = e.getNumber('xOffset')!
	}
	draw() {
		drawCharts(this, this.opts.type, this.opts, this.config, this.context);
	}
	clearTooltip() {
		if (this.opts.tooltip != null) {
			this.opts.animation = false
			this.opts.tooltip = null
			this.draw()
		}
	}
	update(data : UTSJSONObject) {
		// let data = arguments.length > 0 && arguments[0] != undefined ? arguments[0] : {};
		// this.opts = assign({}, this.opts, data);
		// this.opts = UTSJSONObject.assign(this.opts, data);
		this.opts = updateOptions(this.opts, data)
		this.opts.updateData = true;
		this.opts.animation = true
		this.opts.tooltip = null
		let scrollPosition = data.get('scrollPosition') ?? 'current';
		switch (scrollPosition) {
			case 'current':
				this.opts._scrollDistance_ = this.scrollOption.currentOffset;
				break;
			case 'left':
				this.opts._scrollDistance_ = 0;
				this.scrollOption.currentOffset = 0
				this.scrollOption.startTouchX = 0
				this.scrollOption.distance = 0
				this.scrollOption.lastMoveTime = 0
				break;
			case 'right':
				let _calYAxisData = calYAxisData(this.opts.series!, this.opts, this.config)
				let yAxisWidth = _calYAxisData.yAxisWidth!;
				this.config.yAxisWidth = yAxisWidth; //这里类型后续需要兼容才行
				let offsetLeft = 0;
				let _getXAxisPoints0 = getXAxisPoints(this.opts.categories!, this.opts, this.config)
				let xAxisPoints = _getXAxisPoints0.xAxisPoints
				let startX = _getXAxisPoints0.startX!
				let endX = _getXAxisPoints0.endX!
				let eachSpacing = _getXAxisPoints0.eachSpacing!
				let totalWidth = eachSpacing * (xAxisPoints.length - 1);
				let screenWidth = endX - startX;
				offsetLeft = screenWidth - totalWidth;
				this.scrollOption.currentOffset = offsetLeft
				this.scrollOption.startTouchX = offsetLeft
				this.scrollOption.distance = 0
				this.scrollOption.lastMoveTime = 0
				this.opts._scrollDistance_ = offsetLeft;
				break;
		}
		drawCharts(this, this.opts.type, this.opts, this.config, this.context);
	}
	zoom(e : ChartOptionsXAxis | null) {
		let val : ChartOptionsXAxis = e ?? this.opts.xAxis
		if (this.opts.enableScroll != true) {
			console.log('[uCharts] 请启用滚动条后使用')
			return;
		}
		//当前屏幕中间点
		let centerPoint = Math.round(Math.abs(this.scrollOption.currentOffset) / this.opts.chartData.eachSpacing) + Math.round(this.opts.xAxis.itemCount / 2);
		this.opts.animation = false;
		this.opts.xAxis.itemCount = val.itemCount;
		//重新计算x轴偏移距离
		let _calYAxisData = calYAxisData(this.opts.series!, this.opts, this.config)
		let yAxisWidth = _calYAxisData.yAxisWidth!;
		this.config.yAxisWidth = yAxisWidth;
		let offsetLeft = 0;
		let _getXAxisPoints0 = getXAxisPoints(this.opts.categories!, this.opts, this.config)
		let xAxisPoints = _getXAxisPoints0.xAxisPoints
		let startX = _getXAxisPoints0.startX!
		let endX = _getXAxisPoints0.endX!
		let eachSpacing = _getXAxisPoints0.eachSpacing!
		let centerLeft = eachSpacing * centerPoint;
		let screenWidth = endX - startX;
		let MaxLeft = screenWidth - eachSpacing * (xAxisPoints.length - 1);
		offsetLeft = screenWidth / 2 - centerLeft;
		if (offsetLeft > 0) {
			offsetLeft = 0;
		}
		if (offsetLeft < MaxLeft) {
			offsetLeft = MaxLeft;
		}
		this.scrollOption.currentOffset = offsetLeft
		this.scrollOption.startTouchX = 0
		this.scrollOption.distance = 0
		this.scrollOption.lastMoveTime = 0
		calValidDistance(this, offsetLeft, this.opts.chartData, this.opts);
		this.opts._scrollDistance_ = offsetLeft;
		drawCharts(this, this.opts.type, this.opts, this.config, this.context);
	}
	dobuleZoom(e : UniTouchEvent) {
		//问题有点多暂时不翻译
		// if (this.opts.enableScroll != true) {
		// 	console.log('[uCharts] 请启用滚动条后使用')
		// 	return;
		// }
		// const tcs : Touch[] = e.changedTouches;
		// if (tcs.length < 2) {
		// 	return;
		// }
		// // for (let i = 0; i < tcs.length; i++) {
		// // 	tcs[i].x = tcs[i].x ? tcs[i].x : tcs[i].clientX;
		// // 	tcs[i].y = tcs[i].y ? tcs[i].y : tcs[i].clientY;
		// // }
		// const ntcs = [getTouches(this.opts, e, 0), getTouches(this.opts, e, 1)];
		// const xlength = Math.abs(ntcs[0].x - ntcs[1].x);
		// // 记录初始的两指之间的数据
		// if (!this.scrollOption.moveCount) {
		// 	let cts0 = { changedTouches: [{ x: tcs[0].clientX, y: this.opts.area[0] / this.opts.pixelRatio + 2 }] };
		// 	let cts1 = { changedTouches: [{ x: tcs[1].clientX, y: this.opts.area[0] / this.opts.pixelRatio + 2 }] };
		// 	if (this.opts.rotate) {
		// 		cts0 = { changedTouches: [{ x: this.opts.height / this.opts.pixelRatio - this.opts.area[0] / this.opts.pixelRatio - 2, y: tcs[0].clientY }] };
		// 		cts1 = { changedTouches: [{ x: this.opts.height / this.opts.pixelRatio - this.opts.area[0] / this.opts.pixelRatio - 2, y: tcs[1].clientY }] };
		// 	}
		// 	const moveCurrent1 = this.getCurrentDataIndex(cts0).index;
		// 	const moveCurrent2 = this.getCurrentDataIndex(cts1).index;
		// 	const moveCount = Math.abs(moveCurrent1 - moveCurrent2);
		// 	this.scrollOption.moveCount = moveCount;
		// 	this.scrollOption.moveCurrent1 = Math.min(moveCurrent1, moveCurrent2);
		// 	this.scrollOption.moveCurrent2 = Math.max(moveCurrent1, moveCurrent2);
		// 	return;
		// }

		// let currentEachSpacing = xlength / this.scrollOption.moveCount;
		// let itemCount = (this.opts.width - this.opts.area[1] - this.opts.area[3]) / currentEachSpacing;
		// itemCount = itemCount <= 2 ? 2 : itemCount;
		// itemCount = itemCount >= this.opts.categories.length ? this.opts.categories.length : itemCount;
		// this.opts.animation = false;
		// this.opts.xAxis.itemCount = itemCount;
		// // 重新计算滚动条偏移距离
		// let offsetLeft = 0;
		// let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config),
		// 	xAxisPoints = _getXAxisPoints0.xAxisPoints,
		// 	startX = _getXAxisPoints0.startX,
		// 	endX = _getXAxisPoints0.endX,
		// 	eachSpacing = _getXAxisPoints0.eachSpacing;
		// let currentLeft = eachSpacing * this.scrollOption.moveCurrent1;
		// let screenWidth = endX - startX;
		// let MaxLeft = screenWidth - eachSpacing * (xAxisPoints.length - 1);
		// offsetLeft = -currentLeft + Math.min(ntcs[0].x, ntcs[1].x) - this.opts.area[3] - eachSpacing;
		// if (offsetLeft > 0) {
		// 	offsetLeft = 0;
		// }
		// if (offsetLeft < MaxLeft) {
		// 	offsetLeft = MaxLeft;
		// }
		// this.scrollOption.currentOffset = offsetLeft;
		// this.scrollOption.startTouchX = 0;
		// this.scrollOption.distance = 0;
		// calValidDistance(this, offsetLeft, this.opts.chartData, this.config, this.opts);
		// this.opts._scrollDistance_ = offsetLeft;
		// drawCharts(this, this.opts.type, this.opts, this.config, this.context);
	}
	// stopAnimation() {
	// 	this.animationInstance && this.animationInstance.stop();
	// }
	// addEventListener(type, listener) {
	// 	this.uevent.addEventListener(type, listener);
	// }
	// delEventListener(type) {
	// 	this.uevent.delEventListener(type);
	// }
	getLegendDataIndex(e : UniEvent) : number {
		let touches = getTouches(this.opts, e);
		touches.x = touches.x - this.opts.xOffset
		touches.y = touches.y - this.opts.yOffset
		return findLegendIndex(touches, this.opts.chartData.legendData);
	}
	touchLegend(e : UniEvent) : number {
		let index = this.getLegendDataIndex(e);
		if (index >= 0) {
			this.clearTooltip()
			if (this.opts.type == 'candle') {
				this.opts.seriesMA![index].show = !this.opts.seriesMA![index].show;
			} else {
				this.opts.series![index].show = !this.opts.series![index].show;
			}
			this.opts.animation = true
			this.opts._scrollDistance_ = this.scrollOption.currentOffset;
			drawCharts(this, this.opts.type, this.opts, this.config, this.context);
		}
		return index
	}
	// translate(distance) {
	// this.scrollOption = {
	// 	currentOffset: distance,
	// 	startTouchX: distance,
	// 	distance: 0,
	// 	lastMoveTime: 0
	// };
	// let opts = assign({}, this.opts, {
	// 	_scrollDistance_: distance,
	// 	animation: false
	// });
	// drawCharts.call(this, this.opts.type, opts, this.config, this.context);
	// }
	scrollStart(e : UniEvent) {
		let touches = getTouches(this.opts, e);
		if (this.opts.enableScroll == true) {
			this.scrollOption.startTouchX = touches.x;
		}
	}
	scroll(e : UniEvent) {
		this.opts.showTooltip = false
		if (this.scrollOption.lastMoveTime == 0) {
			this.scrollOption.lastMoveTime = Date.now();
		}
		let Limit = this.opts.touchMoveLimit;
		let currMoveTime = Date.now();
		let duration = currMoveTime - this.scrollOption.lastMoveTime;
		if (duration < Math.floor(1000 / Limit)) return;
		if (this.scrollOption.startTouchX == 0) return;
		this.scrollOption.lastMoveTime = currMoveTime;
		if (this.opts.enableScroll == true) {
			let touches = getTouches(this.opts, e);
			let _distance = touches.x - this.scrollOption.startTouchX;
			let currentOffset = this.scrollOption.currentOffset;
			let validDistance = calValidDistance(this, currentOffset + _distance, this.opts.chartData, this.opts);
			_distance = validDistance - currentOffset;
			// 将计算出的滚动距离赋值给this.scrollOption.distance
			this.scrollOption.distance = _distance;
			this.opts._scrollDistance_ = currentOffset + _distance
			this.opts.animation = false
			drawCharts(this, this.opts.type, this.opts, this.config, this.context);
			// return currentOffset + _distance;
		}
	}
	scrollEnd(e : UniEvent) {
		if (this.opts.enableScroll == true) {
			let _scrollOption = this.scrollOption
			let currentOffset = _scrollOption.currentOffset
			let distance = _scrollOption.distance
			this.scrollOption.currentOffset = currentOffset + distance;
			this.scrollOption.distance = 0;
			this.scrollOption.moveCount = 0;
		}
	}
	showToolTip(...args : any[]) : number {
		let tipsIndex : number = -1
		const opts : ChartOptions = this.opts
		if (opts.extra.tooltip != null) {
			this.opts.showTooltip = true
			const e = args[0] as UniEvent
			const option : ChartOptionsTooltipOption = args.length > 1 && args[1] != null ? args[1] as ChartOptionsTooltipOption : new ChartOptionsTooltipOption();
			const _touches$ : TouchPosition = getTouches(this.opts, e);
			const currentOffset : number = this.scrollOption.currentOffset;
			opts._scrollDistance_ = currentOffset
			opts.animation = false
			if (this.opts.type == 'line' || this.opts.type == 'area' || this.opts.type == 'column' || this.opts.type == 'scatter' || this.opts.type == 'bubble') {
				let current : ChartOptionsTooltip = this.getCurrentDataIndex(e);
				let index : any | null = option.index == null ? current.index : option.index;
				if (index != null && (index as number) > -1) {
					tipsIndex = index as number
					let seriesData = getSeriesDataItem(this.opts.series!, index, current.group);
					if (seriesData.length != 0) {
						const _getToolTipData : ChartOptionsTooltipOption = getToolTipData(seriesData, this.opts, index, current.group, this.opts.categories!, option)
						const textList : TextList[] = _getToolTipData.textList!
						const offset : Offset = _getToolTipData.offset!
						offset.y = _touches$.y;
						opts.tooltip = new ChartOptionsTooltip()
						opts.tooltip!.textList = option.textList != null ? option.textList! : textList
						opts.tooltip!.offset = option.offset != null ? option.offset! : offset
						opts.tooltip!.option = option
						opts.tooltip!.index = index
						opts.tooltip!.group = current.group
					}
				} else {
					this.clearTooltip()
				}
				drawCharts(this, opts.type, opts, this.config, this.context);
			}
			if (this.opts.type == 'mount') {
				let index : any | null = option.index == null ? this.getCurrentDataIndex(e).index : option.index;
				if (index != null) {
					tipsIndex = index as number
					if (index as number > -1) {
						this.opts.animation = false
						let opts = this.opts
						let seriesData = opts._series_![index as number];
						const textlist : TextList = new TextList()
						if (option.formatter != null) {
							const fun = option.formatter as (seriesData : ChartOptionsSeries, index : number, opts : ChartOptions) => string
							textlist.text = fun(seriesData, index, opts)
						} else {
							textlist.text = seriesData.name + ': ' + seriesData.data![0].value
						}
						textlist.color = seriesData.color!
						textlist.legendShape = this.opts.extra.tooltip!.legendShape == 'auto' ? seriesData.legendShape! : this.opts.extra.tooltip!.legendShape
						const textList : TextList[] = [textlist]
						const offset = new Offset()
						offset.x = opts.chartData.calPoints![0][index].x
						offset.y = _touches$.y
						opts.tooltip = new ChartOptionsTooltip()
						opts.tooltip!.textList = option.textList != null ? option.textList! : textList
						opts.tooltip!.offset = option.offset != null ? option.offset! : offset
						opts.tooltip!.option = option
						opts.tooltip!.index = index
					}
				} else {
					this.clearTooltip()
				}
				drawCharts(this, opts.type, opts, this.config, this.context);
			}
			if (this.opts.type == 'bar') {
				let current = this.getCurrentDataIndex(e);
				let index : any | null = option.index == null ? current.index : option.index;
				if (index != null) {
					tipsIndex = index as number
					if (index as number > -1) {
						let seriesData = getSeriesDataItem(this.opts.series!, index, current.group);
						if (seriesData.length != 0) {
							let _getToolTipData = getToolTipData(seriesData, this.opts, index, current.group, this.opts.categories!, option)
							let textList = _getToolTipData.textList!
							let offset = _getToolTipData.offset!
							offset.x = _touches$.x;
							offset.y = offset.y + this.opts.yOffset
							opts.tooltip = new ChartOptionsTooltip()
							opts.tooltip!.textList = option.textList != null ? option.textList! : textList
							opts.tooltip!.offset = option.offset != null ? option.offset! : offset
							opts.tooltip!.option = option
							opts.tooltip!.index = index
						}
					}
				} else {
					this.clearTooltip()
				}
				drawCharts(this, opts.type, opts, this.config, this.context);
			}
			if (this.opts.type == 'mix') {
				let current = this.getCurrentDataIndex(e);
				let index : any | null = option.index == null ? current.index : option.index;
				if (index != null) {
					tipsIndex = index as number
					if ((index as number) > -1) {
						let currentOffset = this.scrollOption.currentOffset;
						let opts = this.opts
						opts._scrollDistance_ = currentOffset
						opts.animation = false
						let seriesData = getSeriesDataItem(this.opts.series!, index, current.group);
						if (seriesData.length != 0) {
							let _getMixToolTipData = getMixToolTipData(seriesData, this.opts, index, this.opts.categories!, option)
							let textList = _getMixToolTipData.textList!
							let offset = _getMixToolTipData.offset!
							offset.y = _touches$.y;
							opts.tooltip = new ChartOptionsTooltip()
							opts.tooltip!.textList = option.textList != null ? option.textList! : textList
							opts.tooltip!.offset = option.offset != null ? option.offset! : offset
							opts.tooltip!.option = option
							opts.tooltip!.index = index
						}
					}
				} else {
					this.clearTooltip()
				}
				drawCharts(this, opts.type, opts, this.config, this.context);
			}
			if (this.opts.type == 'candle') {
				let current = this.getCurrentDataIndex(e);
				let index : any | null = option.index == null ? current.index : option.index;
				if (index != null) {
					tipsIndex = index as number
					if (index as number > -1) {
						let currentOffset = this.scrollOption.currentOffset;
						let opts = this.opts
						opts._scrollDistance_ = currentOffset
						opts.animation = false
						let seriesData = getSeriesDataItem(this.opts.series!, index, current.group);
						if (seriesData.length != 0) {
							let _getToolTipData = getCandleToolTipData(this.opts.series![0].dataArr, seriesData, this.opts, index, this.opts.categories!, this.opts.extra.candle!, option)
							let textList = _getToolTipData.textList!
							let offset = _getToolTipData.offset!
							offset.y = _touches$.y;
							opts.tooltip = new ChartOptionsTooltip()
							opts.tooltip!.textList = option.textList ?? textList
							opts.tooltip!.offset = option.offset ?? offset
							opts.tooltip!.option = option
							opts.tooltip!.index = index
						}
					}
				} else {
					this.clearTooltip()
				}
				drawCharts(this, opts.type, opts, this.config, this.context);
			}
			if (this.opts.type == 'pie' || this.opts.type == 'ring' || this.opts.type == 'rose' || this.opts.type == 'funnel') {
				let index : any | null = option.index == null ? this.getCurrentDataIndex(e).index! : option.index;
				if (index != null) {
					tipsIndex = index as number
					if (index as number > -1) {
						let opts = this.opts
						opts.animation = false
						let seriesData : ChartOptionsSeries = opts._series_![index as number];
						const textlist : TextList = new TextList()
						if (option.formatter != null) {
							const fun = option.formatter as (seriesData : ChartOptionsSeries, index : any, opts : ChartOptions) => string
							textlist.text = fun(seriesData, index, opts)
						} else {
							textlist.text = seriesData.name + ': ' + seriesData.data![0].value
						}
						textlist.color = seriesData.color!
						textlist.legendShape = this.opts.extra.tooltip!.legendShape == 'auto' ? seriesData.legendShape! : this.opts.extra.tooltip!.legendShape
						const textList : TextList[] = [textlist]

						let offset = new Offset()
						offset.x = _touches$.x
						offset.y = _touches$.y
						opts.tooltip = new ChartOptionsTooltip()
						opts.tooltip!.textList = option.textList != null ? option.textList! : textList
						opts.tooltip!.offset = option.offset != null ? option.offset! : offset
						opts.tooltip!.option = option
						opts.tooltip!.index = index
					} else {
						this.clearTooltip()
					}
					drawCharts(this, opts.type, opts, this.config, this.context);
				}
			}
			if (this.opts.type == 'map') {
				let index : any | null = option.index == null ? this.getCurrentDataIndex(e).index : option.index;
				if (index != null) {
					tipsIndex = index as number
					if (index as number > -1) {
						let opts = this.opts
						opts.animation = false
						let seriesData = this.opts.series![index];
						seriesData.name = seriesData.properties.name
						const textList : TextList[] = []
						const text = new TextList()
						if (option.formatter != null) {
							const fun = option.formatter as (item : ChartOptionsSeries, index : number, opts : ChartOptions) => string
							text.text = fun(seriesData, index, this.opts)
						} else {
							text.text = seriesData.name!
						}

						text.color = seriesData.color!
						text.legendShape = this.opts.extra.tooltip!.legendShape == 'auto' ? seriesData.legendShape! : this.opts.extra.tooltip!.legendShape
						textList.push(text)
						const offset = new Offset()
						offset.x = _touches$.x - this.opts.xOffset
						offset.y = _touches$.y - this.opts.yOffset
						opts.tooltip = new ChartOptionsTooltip()
						opts.tooltip!.textList = option.textList != null ? option.textList! : textList
						opts.tooltip!.offset = option.offset != null ? option.offset! : offset
						opts.tooltip!.option = option
						opts.tooltip!.index = index
					} else {
						this.clearTooltip()
					}
					opts.updateData = false;
					drawCharts(this, opts.type, opts, this.config, this.context);
				}
			}
			if (this.opts.type == 'word') {
				let index : any | null = option.index == null ? this.getCurrentDataIndex(e).index : option.index;
				if (index != null) {
					tipsIndex = index as number
					if (index as number > -1) {
						let opts = this.opts
						opts.animation = false
						let seriesData = this.opts.series![index as number];
						const textlist : TextList = new TextList()
						if (option.formatter != null) {
							const fun = option.formatter as (seriesData : ChartOptionsSeries, index : any, opts : ChartOptions) => string
							textlist.text = fun(seriesData, index, opts)
						} else {
							textlist.text = seriesData.name!
						}
						textlist.color = seriesData.color!
						textlist.legendShape = this.opts.extra.tooltip!.legendShape == 'auto' ? seriesData.legendShape! : this.opts.extra.tooltip!.legendShape
						const textList : TextList[] = [textlist]

						let offset = new Offset()
						offset.x = _touches$.x
						offset.y = _touches$.y
						opts.tooltip = new ChartOptionsTooltip()
						opts.tooltip!.textList = option.textList != null ? option.textList! : textList
						opts.tooltip!.offset = option.offset != null ? option.offset! : offset
						opts.tooltip!.option = option
						opts.tooltip!.index = index
					} else {
						this.clearTooltip()
					}
					opts.updateData = false;
					drawCharts(this, opts.type, opts, this.config, this.context);
				}
			}
			if (this.opts.type == 'radar') {
				const current = this.getCurrentDataIndex(e)
				let index = option.index == null ? current.index : option.index;
				if (index != null) {
					tipsIndex = index as number
					if ((index as number) > -1) {
						let opts = this.opts;
						opts.animation = false
						let seriesData = getSeriesDataItem(this.opts.series!, index, current.group);
						if (seriesData.length != 0) {
							let textList : TextList[] = seriesData.map((item : ChartOptionsSeries) : TextList => {
								const list = new TextList()
								if (option.formatter != null) {
									const fun = option.formatter as (item : ChartOptionsSeries, categories : string, index : number, opts : ChartOptions) => string
									list.text = fun(item, this.opts.categories![index], index, this.opts)
								} else {
									list.text = item.name + ': ' + item.data![0].value!
								}
								list.color = item.color!
								list.legendShape = this.opts.extra.tooltip!.legendShape == 'auto' ? item.legendShape! : this.opts.extra.tooltip!.legendShape
								return list
							});
							let offset = new Offset()
							offset.x = _touches$.x
							offset.y = _touches$.y
							opts.tooltip = new ChartOptionsTooltip()
							opts.tooltip!.textList = option.textList != null ? option.textList! : textList
							opts.tooltip!.offset = option.offset != null ? option.offset! : offset
							opts.tooltip!.option = option
							opts.tooltip!.index = index
						}
					} else {
						this.clearTooltip()
					}
					drawCharts(this, opts.type, opts, this.config, this.context);
				}
			}
		}
		return tipsIndex
	}
	getCurrentDataIndex(e : UniEvent) : ChartOptionsTooltip {
		let tooltip : ChartOptionsTooltip = new ChartOptionsTooltip()
		let _touches$ : TouchPosition = getTouches(this.opts, e);
		_touches$.x = _touches$.x - this.opts.xOffset
		_touches$.y = _touches$.y - this.opts.yOffset
		if (this.opts.type == 'pie' || this.opts.type == 'ring') {
			return findPieChartCurrentIndex(_touches$, this.opts.chartData.pieData!, this.opts);
		} else if (this.opts.type == 'rose') {
			return findRoseChartCurrentIndex(_touches$, this.opts.chartData.pieData!, this.opts);
		} else if (this.opts.type == 'radar') {
			return findRadarChartCurrentIndex(_touches$, this.opts.chartData.radarData!, this.opts.categories!.length);
		} else if (this.opts.type == 'funnel') {
			_touches$.x = _touches$.x + this.opts.xOffset
			_touches$.y = _touches$.y + this.opts.yOffset
			return findFunnelChartCurrentIndex(_touches$, this.opts.chartData.funnelData!);
		} else if (this.opts.type == 'map') {
			return findMapChartCurrentIndex(_touches$, this.opts);
		} else if (this.opts.type == 'word') {
			return findWordChartCurrentIndex(_touches$, this.opts.chartData.wordCloudData!);
		} else if (this.opts.type == 'bar') {
			tooltip = findBarChartCurrentIndex(_touches$, this.opts.chartData.calPoints, this.opts, Math.abs(this.scrollOption.currentOffset));
		} else if (this.opts.type == 'candle') {
			tooltip = findCandleChartCurrentIndex(_touches$, this.opts.chartData.calMapPoints!, this.opts, Math.abs(this.scrollOption.currentOffset));
		} else {
			tooltip = findCurrentIndex(_touches$, this.opts.chartData.calPoints!, this.opts, Math.abs(this.scrollOption.currentOffset));
		}
		return tooltip
	}
}