var myChart;
var app = new Vue({
	el: '#app',
	data: {
		MA5: '',
		MA10: '',
		MA30: '',
		volMA5: '',
		volMA10: '',
		current: "15m",
		tabs: [{
				'label': '1分鐘',
				'value': "1m"
			},
			{
				'label': '15分鐘',
				'value': "15m"
			},
			{
				'label': '30分鐘',
				'value': "30m"
			},
			{
				'label': '1小時',
				'value': "1H"
			},
			{
				'label': '4小時',
				'value': "4H"
			},
			{
				'label': '1日',
				'value': "1D"
			},
		],
		category: 2,
		categoryList: [{
				'label': '深度',
				'value': 1
			},
			{
				'label': '成交',
				'value': 2
			},
			{
				'label': '简介',
				'value': 3
			},
		],
		txData: {
			lastPrice: '',
			high: '',
			volume: '',
			low: '',
			upRate: '',
		}, //交易数据统计
		buyList: [],
		sellList: [],
		dealHis: [],
		tokenInfo: {},
		page: 1,
		// 保存商品id
		typeId: '',
		// 保存socket对象
		webSocket: '',
		// 保存当前k线数据
		dataKLine: {
			data: [],
			dates: [],
			volumes: [],
		},
		// 保存初始未处理的时间数据
		oldDataKLine: ''

	},
	created() {
		// this.getTxData()
		// this.getDepth()
		// 保存商品id
		this.typeId = getQueryString('type');
		// 简历长连接
		this.scoketInit()
	},
	mounted() {
		myChart = echarts.init(document.getElementById('main'));
		this.draw()
		this.getKline((new Date()).getTime());
		// 获取成交记录
		this.getDealHis();
	},
	methods: {
		// 返回上一页
		back(url) {
			console.log('cf', url);
			uni.navigateTo({
				url
			})
			uni.postMessage({
				data: {
					action: 'message'
				}
			});
		},

		scoketInit() {
			const that = this;
			// 初始化websocket
			that.webSocket = new WebSocket("wss://wsaws.okx.com:8443/ws/v5/public");
			that.webSocket.onopen = function(event) {
				console.log('打开链接成功');
				const requestKData = JSON.stringify({
					"op": "subscribe",
					"args": [{
						"channel": "candle" + that.current,
						"instId": that.typeId
					}]
				})
				const requestNewData = JSON.stringify({
					"op": "subscribe",
					"args": [{
						"channel": "tickers",
						"instId": that.typeId
					}]
				})
				// 获取k线数据
				that.webSocket.send(requestKData)
				// 获取当前行情数据
				that.webSocket.send(requestNewData)
			}
			// 监听socket回复事件
			that.webSocket.addEventListener('message', function(event) {
				const item = JSON.parse(event.data);
				try {
					// 判断是否为
					if (item.arg.channel == ("candle" + that.current) && item.data) {
						const daytime = new Date(+item.data[0][0]);
						item.data[0][0] = that.initDay(daytime, "YYYY-mm-dd HH:MM:SS")
						if (item.data[0][0] != that.dataKLine.dates[that.dataKLine.dates.length - 1]) {
							// console.log(item.data[0][0], 'jiange', that.dataKLine.dates[that.dataKLine
							// 	.dates.length - 1]);
							const itemi = item.data[0]
							that.dataKLine.dates.push(itemi[0])
							that.dataKLine.data.push([+itemi[1], +itemi[2], +itemi[3], +itemi[4], +
								itemi[5]
							])
							that.dataKLine.volumes.push([that.dataKLine.volumes.length, +itemi[5], +
								itemi[1] > +itemi[2] ? 1 : -1
							])
							that.setKline()
						}
						// that.txData.lastPrice = data.data[0][]
					}
					// 
					if (item.arg.channel == ("tickers") && item.data[0]) {
						// console.log('tickers');
						const data = item.data[0]
						that.txData.name = data.instId
						that.txData.lastPrice = +data.last
						that.txData.high = +data.high24h
						that.txData.volume = +data.open24h
						that.txData.low = +data.low24h
						that.txData.upRate = ((that.txData.lastPrice - that.txData.volume) / that.txData
							.volume * 100).toFixed(2)
						txData.upFlag = +that.txData.upRate > 0 ? 1 : 2;
					}
				} catch (e) {
					console.log("item: " + JSON.stringify(item));
				}

			});
			that.webSocket.onclose = function(event) {
				that.$nextTick(() => {
					that.scoketInit()
					that.dataKLine = {
						data: [],
						dates: [],
						volumes: [],
					};
					that.getKline((new Date()).getTime())
				})
			};
		},
		// 获取24小时交易数据统计
		getTxData() {
			this.txData = txData;
		},
		// 初始化数据结构
		dataInit(data, type) {

			let items;
			if (type == 1) {
				items = data.map(function(item) {
					return item[0];
				});
			}
			if (type == 2) {
				items = data.map(function(item) {
					// console.log(
					// 	`[${+item[1]},${+item[2]},${+item[3]},${+item[4]},${+item[5]}, ${+item[1] > +item[2] ? 1 : -1}]`,
					// 	'数据结果');
					return [+item[1], +item[4], +item[3], +item[2], +item[5]];
				});
			}
			if (type == 3) {
				items = data.map(function(item, index) {
					// console.log(`[${index},${+item[1]},${+item[2]},${+item[3]},${+item[4]},${+item[5]}, ${+item[1] > +item[2] ? 1 : -1}]`,'数据结果');
					return [index, +item[5], +item[1] > +item[4] ? 1 : -1];
				});
			}
			return items

		},
		// 初始化时间
		initDay(time, fmt) {
			let ret;
			const opt = {
				"Y+": time.getFullYear().toString(), //年
				"m+": (time.getMonth() + 1).toString(), //月
				"d+": time.getDate().toString(), //日 
				"H+": time.getHours().toString(), //小时 
				"M+": time.getMinutes().toString(), //分 
				"S+": time.getSeconds().toString() //秒 
			};
			for (let k in opt) {
				ret = new RegExp("(" + k + ")").exec(fmt)
				if (ret) {
					fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length,
						"0")));
				}
			}
			return fmt;
		},
		// 获取k线数据,生成k线
		getKline(time) {
			console.log('qq');
			const that = this;
			// const tiemt = (new Date()).getTime() - (1000*60*60*24*6);
			// console.log(tiemt,'k闲时间')
			axiosGet('/index/history', {
				// axiosGet('/api/v5/market/history-candles', {
				after: time,
				instId: that.typeId,
				bar: that.current,
			}).then((res) => {
				// 保存初始返回res对象
				that.oldDataKLine = res[res.length-1][0];
				// console.log(that.initDay(new Date(+that.oldDataKLine), "YYYY-mm-dd HH:MM:SS"))
				// console.log(that.initDay(new Date(+res[0][0]), "YYYY-mm-dd HH:MM:SS"))
				const ar = res.map((e) => {
					let dateTime = new Date(+e[0]);
					e[0] = that.initDay(dateTime, "YYYY-mm-dd HH:MM:SS");
					return e
				}).reverse()
				that.dataKLine.dates.unshift(...that.dataInit(ar, 1))
				that.dataKLine.data.unshift(...that.dataInit(ar, 2))
				that.dataKLine.volumes.unshift(...that.dataInit(ar, 3))
				// that.dataKLine = {
				// 	dates: that.dataInit(ar, 1),
				// 	data: that.dataInit(ar, 2),
				// 	volumes: that.dataInit(ar, 3),
				// }

				that.setKline()
			}).catch((e) => {
				console.log(e, '2222');
			})
		},
		// 设置线条数据
		setKline() {
			const that = this;
			var dataMA5 = that.calculateMA(5, that.dataKLine.data);
			var dataMA10 = that.calculateMA(10, that.dataKLine.data);
			var dataMA30 = that.calculateMA(30, that.dataKLine.data);
			var volumeMA5 = that.calculateMA(5, that.dataKLine.volumes);
			var volumeMA10 = that.calculateMA(10, that.dataKLine.volumes);
			myChart.setOption({
				xAxis: [{
						data: that.dataKLine.dates
					},
					{
						data: that.dataKLine.dates
					},
				],
				series: [{
						name: '日K',
						data: that.dataKLine.data
					},
					{
						name: 'MA5',
						data: dataMA5
					},
					{
						name: 'MA10',
						data: dataMA10
					},
					{
						name: 'MA30',
						data: dataMA30
					},
					{
						name: 'Volume',
						data: that.dataKLine.volumes
					},
					{
						name: 'VolumeMA5',
						data: volumeMA5
					},
					{
						name: 'VolumeMA10',
						data: volumeMA10
					},
				]
			})
		},
		// 列表条数不足补全
		addItem(list, type) {
			// type: 1开头加，2末尾加
			list = list || [];
			let len = 20 - list.length;
			if (len > 0) {
				for (let i = 0; i < len; i++) {
					if (type == 1) {
						list.unshift({})
					} else {
						list.push({})
					}
				}
			}
			return list;
		},
		// 获取深度数据
		// getDepth() {
		// 	this.buyList = this.addItem(depthList().buyList || []);
		// 	this.sellList = this.addItem(depthList().sellList || []);
		// },
		// 获取成交记录
		getDealHis() {
			const that = this;
			axiosGet('/index/deal', {
				// axiosGet('/api/v5/market/trades', {
				instId: that.typeId,
				limit: 150
			}).then((res) => {
				// 处理返回数据
				this.dealHis = res.map((e) => {
					const dateTime = new Date(+e.ts)
					return {
						"date": that.initDay(dateTime, "mm-dd HH:MM:SS"),
						// 1买入 2卖出
						"takerFlag": e.side == 'buy' ? "1" : '2',
						"price": e.px,
						"amount": e.sz
					}
				})
			}).catch((e) => {
				console.log("e: " + JSON.stringify(e));
				console.log(e);
			})
		},
		// 获取项目简介信息
		getTokenInfo() {
			this.tokenInfo = tokenInfo;
		},

		// 切换tab
		switchTab(val) {
			const that = this;
			if (that.current == val) {
				return
			};
			that.current = val;
			that.webSocket.close()

		},
		// 切换类目
		switchCategory(val) {
			if (this.category == val) return;
			this.category = val;
			if (this.category == 1) {
				this.getDepth()
			} else if (this.category == 2) {
				this.getDealHis()
			} else {
				this.getTokenInfo()
			}
		},
		// 截取数字字符串 保留precision小数
		formatterNum(value, precision) {
			// console.log(value)
			let reg = new RegExp('^\\d+(?:\\.\\d{0,' + precision + '})?')
			// return value.toString().match(reg)
			return value.toString()
		},
		// 计算MA
		calculateMA(dayCount, data) {
			var result = [];
			for (var i = 0, len = data.length; i < len; i++) {
				if (i < dayCount) {
					result.push('-');
					continue;
				}
				var sum = 0;
				for (var j = 0; j < dayCount; j++) {
					sum += data[i - j][1];
				}
				// console.log(sum, dayCount)
				result.push((sum / dayCount));
				// result.push((sum / dayCount).toFixed(2));
			}
			return result;
		},
		// 绘制(配置项)
		draw() {
			let that = this;
			var upColor = '#03ad91';
			var downColor = '#dd345b';
			var colorList = ['#c23531', '#2f4554', '#61a0a8', '#d48265', '#91c7ae', '#749f83', '#ca8622',
				'#bda29a', '#6e7074',
				'#546570', '#c4ccd3'
			];
			var labelFont = 'bold 12px Sans-serif';
			var option = {
				backgroundColor: '#0d1723',
				title: {
					show: false
				},
				legend: {
					show: false
				},
				visualMap: {
					show: false,
					seriesIndex: 4,
					dimension: 2,
					pieces: [{
						value: 1,
						color: downColor
					}, {
						value: -1,
						color: upColor
					}]
				},
				grid: [{
						top: '5%',
						left: 20,
						right: 20,
						height: '70%'
					},
					{
						top: '80%',
						left: 20,
						right: 20,
						height: '16%'
					},
				],
				axisPointer: { //坐标轴指示器配置项
					link: {
						xAxisIndex: 'all'
					},
					label: {
						backgroundColor: '#0d1723',
						color: '#fff',
						borderColor: 'rgb(99, 117, 139)',
						borderWidth: 1,
						borderRadius: 2,
						fontSize: 10
					}
				},
				xAxis: [{
					type: 'category', //坐标轴类型。(value:数值轴，适用于连续数据。,category:类目轴，适用于离散的类目数据,time: 时间轴，适用于连续的时序数据,log:对数轴。适用于对数数据)
					data: [], //类目数据，在类目轴（type: 'category'）中有效。
					scale: true,
					boundaryGap: false, //坐标轴两边留白策略，类目轴和非类目轴的设置和表现不一样。
					axisLine: {
						show: false
					}, //坐标轴轴线相关设置
					axisTick: {
						show: false
					}, //坐标轴刻度相关设置。
					axisLabel: {
						show: false,
					}, //坐标轴刻度标签的相关设置。
					splitLine: {
						show: false,
						lineStyle: {
							color: 'rgba(255,255,255, 0.1)'
						}
					}, //坐标轴在 grid 区域中的分隔线。
					min: 'dataMin', //坐标轴刻度最小值。可以设置成特殊值 'dataMin'，此时取数据在该轴上的最小值作为最小刻度。
					max: 'dataMax', //坐标轴刻度最大值。可以设置成特殊值 'dataMax'，此时取数据在该轴上的最大值作为最大刻度。
					axisPointer: {
						label: {
							margin: 200
						}
					},
				}, {
					type: 'category',
					gridIndex: 1, //x 轴所在的 grid 的索引，默认位于第一个 grid。
					data: [], //类目数据，在类目轴（type: 'category'）中有效。
					scale: true,
					boundaryGap: false, //坐标轴两边留白策略，类目轴和非类目轴的设置和表现不一样。
					axisLine: {
						show: false,
						lineStyle: {
							color: 'rgba(255,255,255,1)',
							width: 1
						}
					}, //坐标轴轴线相关设置
					axisTick: {
						show: false
					}, //坐标轴刻度相关设置。
					axisLabel: { //坐标轴刻度标签的相关设置。
						show: true,
						margin: 6,
						fontSize: 10,
						color: 'rgba(99, 117, 139, 1.0)',
						formatter: function(value) {
							// console.log(value,'mmdd');
							return echarts.format.formatTime('MM-dd', value);
						}
					},
					splitNumber: 20,
					splitLine: {
						show: false,
						lineStyle: {
							color: 'rgba(255,255,255, 0.1)'
						}
					}, //坐标轴在 grid 区域中的分隔线。
					min: 'dataMin', //坐标轴刻度最小值。可以设置成特殊值 'dataMin'，此时取数据在该轴上的最小值作为最小刻度。
					max: 'dataMax', //坐标轴刻度最大值。可以设置成特殊值 'dataMax'，此时取数据在该轴上的最大值作为最大刻度。
					// axisPointer: { show: true, type: 'none', label: { show: false }},
				}],
				yAxis: [{
					type: 'value', //坐标轴类型。(value:数值轴，适用于连续数据。,category:类目轴，适用于离散的类目数据,time: 时间轴，适用于连续的时序数据,log:对数轴。适用于对数数据)
					position: 'right', //y 轴的位置。'left','right'
					scale: true, //是否是脱离 0 值比例。设置成 true 后坐标刻度不会强制包含零刻度。在双数值轴的散点图中比较有用。(在设置 min 和 max 之后该配置项无效。)
					axisLine: {
						show: true
					}, //坐标轴轴线相关设置。
					axisTick: {
						show: true,
						inside: true
					}, //坐标轴刻度相关设置。
					axisLabel: { //坐标轴刻度标签的相关设置。
						show: true,
						color: 'rgba(99, 117, 139, 1.0)',
						inside: true,
						fontSize: 10,
						formatter: function(value) {
							return Number(value)
							// return Number(value).toFixed(2)
						}
					},
					splitLine: {
						show: false,
						lineStyle: {
							color: 'rgba(255,255,255, 0.1)'
						}
					}, //坐标轴在 grid 区域中的分隔线。
				}, {
					type: 'value',
					position: 'right',
					scale: true,
					gridIndex: 1,
					axisLine: {
						show: false
					},
					axisTick: {
						show: false
					},
					axisLabel: {
						show: false
					},
					splitLine: {
						show: false
					}
				}],

				animation: false, //是否开启动画。
				color: colorList,
				tooltip: {
					show: true, //是否显示提示框组件，包括提示框浮层和 axisPointer。
					trigger: 'axis', //触发类型。item,axis,none
					formatter(params) {
						console.log("params: " + JSON.stringify(params));
						let tooltip = '';
						let time = '',
							open = 0,
							high = 0,
							low = 0,
							close = 0,
							amount = 0;
						for (var i = 0; i < params.length; i++) {
							if (params[i].seriesName === '日K') {
								time = params[i].name;
								open = params[i].data.length > 1 ? Number(that.formatterNum(params[i].data[
									1], 2)) : 0;
								close = params[i].data.length > 1 ? Number(that.formatterNum(params[i].data[
									2], 2)) : 0;
								low = params[i].data.length > 1 ? Number(that.formatterNum(params[i].data[
									3], 2)) : 0;
								high = params[i].data.length > 1 ? Number(that.formatterNum(params[i].data[
									4], 2)) : 0;
								amount = params[i].data.length > 1 ? Number(that.formatterNum(params[i]
									.data[5], 2)) : 0;
								// console.log(time,open,close,low,high,amount)
								tooltip = '<div class="charts-tooltip">' +
									'<div class="charts-tooltip-row"><div class="ctr-label">' + '时间' +
									'</div><div class="ctr-value">' + time + '</div></div>' +
									'<div class="charts-tooltip-row"><div class="ctr-label">' + '开' +
									'</div><div class="ctr-value">' + open + '</div></div>' +
									'<div class="charts-tooltip-row"><div class="ctr-label">' + '高' +
									'</div><div class="ctr-value">' + high + '</div></div>' +
									'<div class="charts-tooltip-row"><div class="ctr-label">' + '低' +
									'</div><div class="ctr-value">' + low + '</div></div>' +
									'<div class="charts-tooltip-row"><div class="ctr-label">' + '收' +
									'</div><div class="ctr-value">' + close + '</div></div>' +
									'<div class="charts-tooltip-row"><div class="ctr-label">' + '数量' +
									'</div><div class="ctr-value">' + amount + '</div></div></div>';
							}
							if (params[i].seriesName === 'MA5') {
								that.MA5 = params[i].data !== 'NAN' ? Number(that.formatterNum(params[i]
									.data, 2)) : 0
							}
							if (params[i].seriesName === 'MA10') {
								that.MA10 = params[i].data !== 'NAN' ? Number(that.formatterNum(params[i]
									.data, 2)) : 0
							}
							if (params[i].seriesName === 'MA30') {
								that.MA30 = params[i].data !== 'NAN' ? Number(that.formatterNum(params[i]
									.data, 2)) : 0
							}
							if (params[i].seriesName === 'VolumeMA5') {
								that.volMA5 = params[i].data !== 'NAN' ? Number(that.formatterNum(params[i]
									.data, 2)) : 0
							}
							if (params[i].seriesName === 'VolumeMA10') {
								that.volMA10 = params[i].data !== 'NAN' ? Number(that.formatterNum(params[i]
									.data, 2)) : 0
							}
						}
						return tooltip;
					},
					triggerOn: 'click', //提示框触发的条件 'mousemove','click','mousemove|click','none'
					textStyle: {
						fontSize: 10
					}, //提示框浮层的文本样式
					backgroundColor: 'rgba(30,42,66,0.8);', //提示框浮层的背景颜色。
					borderColor: '#2f3a56', //提示框浮层的边框颜色。
					borderWidth: 2,
					position: function(pos, params, el, elRect, size) { //提示框浮层的位置，默认不设置时位置会跟随鼠标的位置。
						var obj = {
							top: 20
						};
						obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 10;
						return obj;
					},
					axisPointer: { //坐标轴指示器配置项。
						label: {
							color: 'rgba(255,255,255,.87)',
							fontSize: 9,
							backgroundColor: '#020204',
							borderColor: "#9c9fa4",
							shadowBlur: 0,
							borderWidth: 0.5,
							padding: [4, 2, 3, 2],
						},
						animation: false,
						type: 'cross',
						lineStyle: {
							color: {
								type: 'linear',
								x: 0,
								y: 0,
								x2: 0,
								y2: 1,
								colorStops: [{
									offset: 0,
									color: 'rgba(30, 42, 66, 0.1)' // 0% 处的颜色
								}, {
									offset: 0.7,
									color: 'rgba(30, 42, 66,0.9)' // 100% 处的颜色
								}, {
									offset: 1,
									color: 'rgba(30, 42, 66,0.2)' // 100% 处的颜色
								}]
							},
							width: 10,
							shadowColor: 'rgba(30, 42, 66,0.7)',
							shadowBlur: 0,
							shadowOffsetY: 68,
						}
					}
				},

				dataZoom: [{ //用于区域缩放
					type: 'inside',
					xAxisIndex: [0, 1],
					realtime: false,
					start: 50,
					end: 100,
				}],
				series: [{
						type: 'candlestick',
						name: '日K',
						data: [],
						itemStyle: {
							color: upColor,
							color0: downColor,
							borderColor: upColor,
							borderColor0: downColor
						},
						markPoint: {
							symbol: 'rect',
							symbolSize: [-10, 0.5],
							symbolOffset: [-5, 0],
							itemStyle: {
								color: 'rgba(255,255,255,.87)'
							},
							label: {
								color: 'rgba(255,255,255,.87)',
								offset: [3, 0],
								fontSize: 10,
								position: "left",
								align: 'right',
								formatter: function(params) {
									// console.log(params.value,'传入的处理数值');
									// return Number(params.value).toFixed(2)
									return Number(params.value)
								}
							},
							data: [{
									name: 'max',
									type: 'max',
									valueDim: 'highest'
								},
								{
									name: 'min',
									type: 'min',
									valueDim: 'lowest'
								}
							]
						},
					},
					{
						name: 'MA5',
						type: 'line',
						data: [],
						symbol: 'none', //去除圆点
						smooth: true,
						lineStyle: {
							normal: {
								opacity: 1,
								width: 1,
								color: "#eef4ba"
							}
						},
						z: 5
					},
					{
						name: 'MA10',
						type: 'line',
						data: [],
						symbol: 'none', //去除圆点
						smooth: true,
						lineStyle: {
							normal: {
								opacity: 1,
								width: 1,
								color: '#83c1c5'
							}
						},
						z: 4
					},
					{
						name: 'MA30',
						type: 'line',
						data: [],
						symbol: 'none', //去除圆点
						smooth: true,
						lineStyle: {
							normal: {
								opacity: 1,
								width: 1,
								color: '#b39cd8'
							}
						},
						z: 3
					},
					{
						name: 'Volume',
						type: 'bar',
						xAxisIndex: 1,
						yAxisIndex: 1,
						data: []
					},
					{
						name: 'VolumeMA5',
						type: 'line',
						xAxisIndex: 1,
						yAxisIndex: 1,
						data: [],
						symbol: 'none', //去除圆点
						smooth: true,
						lineStyle: {
							normal: {
								opacity: 1,
								width: 1,
								color: "#eef4ba"
							}
						},
						z: 5
					},
					{
						name: 'VolumeMA10',
						type: 'line',
						xAxisIndex: 1,
						yAxisIndex: 1,
						data: [],
						symbol: 'none', //去除圆点
						smooth: true,
						lineStyle: {
							normal: {
								opacity: 1,
								width: 1,
								color: '#83c1c5'
							}
						},
						z: 4
					},
				]
			};
			myChart.setOption(option);
			// 加载上一页数据
			myChart.on('datazoom', function(params) {
				let num = params.batch[0]['start'];
				if (num == 0) {
					console.log('到最左边了')
					// console.log(that.initDay(new Date(+that.oldDataKLine), "YYYY-mm-dd HH:MM:SS"));
					// that.getKline(that.oldDataKLine)
				}
			})
			window.addEventListener('resize', () => {
				myChart.resize()
			})
		}
	}
})
