using System.Collections.Generic;
using UnityEngine;
namespace XCharts.Runtime
{
    /// 
    /// Heat map mainly use colors to represent values, which must be used along with visualMap component.
    /// It can be used in either rectangular coordinate or geographic coordinate. But the behaviour on them are quite different. Rectangular coordinate must have two categories to use it.
    /// ||热力图主要通过颜色去表现数值的大小,必须要配合 visualMap 组件使用。
    /// 可以应用在直角坐标系以及地理坐标系上,这两个坐标系上的表现形式相差很大,直角坐标系上必须要使用两个类目轴。
    /// 
    [AddComponentMenu("XCharts/HeatmapChart", 18)]
    [ExecuteInEditMode]
    [RequireComponent(typeof(RectTransform))]
    [DisallowMultipleComponent]
    [HelpURL("https://xcharts-team.github.io/docs/configuration")]
    public class HeatmapChart : BaseChart
    {
        protected override void DefaultChart()
        {
            var grid = EnsureChartComponent();
            grid.UpdateRuntimeData(this);
            grid.left = 0.12f;
            var heatmapGridWid = 18f;
            int xSplitNumber = (int)(grid.context.width / heatmapGridWid);
            int ySplitNumber = (int)(grid.context.height / heatmapGridWid);
            var xAxis = EnsureChartComponent();
            xAxis.type = Axis.AxisType.Category;
            xAxis.splitLine.show = false;
            xAxis.boundaryGap = true;
            xAxis.splitNumber = xSplitNumber / 2;
            var yAxis = EnsureChartComponent();
            yAxis.type = Axis.AxisType.Category;
            yAxis.splitLine.show = false;
            yAxis.boundaryGap = true;
            yAxis.splitNumber = ySplitNumber;
            RemoveData();
            Heatmap.AddDefaultSerie(this, GenerateDefaultSerieName());
            var visualMap = EnsureChartComponent();
            visualMap.autoMinMax = true;
            visualMap.orient = Orient.Vertical;
            visualMap.calculable = true;
            visualMap.location.align = Location.Align.BottomLeft;
            visualMap.location.bottom = 100;
            visualMap.location.left = 30;
            var colors = new List
            {
                "#313695",
                "#4575b4",
                "#74add1",
                "#abd9e9",
                "#e0f3f8",
                "#ffffbf",
                "#fee090",
                "#fdae61",
                "#f46d43",
                "#d73027",
                "#a50026"
            };
            visualMap.AddColors(colors);
            for (int i = 0; i < xSplitNumber; i++)
            {
                xAxis.data.Add((i + 1).ToString());
            }
            for (int i = 0; i < ySplitNumber; i++)
            {
                yAxis.data.Add((i + 1).ToString());
            }
            for (int i = 0; i < xSplitNumber; i++)
            {
                for (int j = 0; j < ySplitNumber; j++)
                {
                    var value = Random.Range(0, 150);
                    var list = new List { i, j, value };
                    AddData(0, list);
                }
            }
        }
        /// 
        /// default count heatmap chart.
        /// || 默认计数热力图。
        /// 
        public void DefaultCountHeatmapChart()
        {
            CheckChartInit();
            var serie = GetSerie(0);
            serie.heatmapType = HeatmapType.Count;
            var xAxis = GetChartComponent();
            xAxis.type = Axis.AxisType.Value;
            xAxis.splitNumber = 4;
            var yAxis = GetChartComponent();
            yAxis.type = Axis.AxisType.Value;
            yAxis.splitNumber = 2;
            serie.ClearData();
            for (int i = 0; i < 100; i++)
            {
                var x = UnityEngine.Random.Range(0, 100);
                var y = UnityEngine.Random.Range(0, 100);
                AddData(0, x, y);
            }
        }
    }
}