using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using WeifenLuo.WinFormsUI.Docking;

namespace friction
{
	public partial class PanelRadarGraph : DockContent
	{
		MainForm m_Owner = null;
		DataHandler m_DataHandler = null;

		string m_CurSpring = "";

		public PanelRadarGraph(MainForm owner, DataHandler data)
		{
			InitializeComponent();

			m_Owner = owner;
			m_DataHandler = data;

			Theme.Apply(this);


			chart.ChartAreas[0].AxisY.Maximum = 10;

			chart.Series["SeriesHigh"].Color = Color.FromArgb(255, 200, 200, 200);
			chart.Series["SeriesPotential"].Color = Color.FromArgb(255, 180, 180, 180);
			chart.Series["SeriesNo"].Color = Color.FromArgb(255, 140, 140, 140);

			chart.Series["SeriesMax"].Color = Theme.Red;
			chart.Series["SeriesAvg"].Color = Theme.Yellow;
			chart.Series["SeriesMin"].Color = Theme.Green;

			chart.ChartAreas[0].AxisX.MajorGrid.LineWidth = 1;
			chart.ChartAreas[0].AxisY.MajorGrid.LineWidth = 1;
			chart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.Black;
			chart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;
			chart.ChartAreas[0].AxisX.MinorTickMark.Enabled = false;
			chart.ChartAreas[0].AxisY.MajorTickMark.Enabled = true;
			chart.ChartAreas[0].AxisY.MajorTickMark.LineWidth = 1;
			chart.ChartAreas[0].AxisY.MajorTickMark.LineColor = Color.FromArgb(150, 0, 0, 0);
			chart.ChartAreas[0].AxisY.MinorTickMark.Enabled = false;

			foreach (var series in chart.Series)
				series["AreaDrawingStyle"] = "Polygon";
		}

		public void Reset()
		{
			m_CurSpring = "";
		}

		public void UpdateGraph()
		{
			string strSpring = m_DataHandler.GetCurSpring();
			if (m_CurSpring == strSpring)
				return;

			lbSpring.Text = "Material Spring: " + strSpring;
			lbSpring.BackColor = Color.Transparent;
			lbSpring.ForeColor = Color.Orange;

			foreach (var series in chart.Series)
				series.Points.Clear();

			List<DataHandler.RADAR_CHART> graphData = m_DataHandler.GetAvgAll(strSpring);

			List<string> xValues = new List<string>();
			List<float> yValues = new List<float>();

			foreach(var data in graphData)
			{
				chart.Series["SeriesMax"].Points.AddXY(data.m_strTable, data.m_fMax);
				chart.Series["SeriesAvg"].Points.AddXY(data.m_strTable, data.m_fAvg);
				chart.Series["SeriesMin"].Points.AddXY(data.m_strTable, data.m_fMin);

				chart.Series["SeriesHigh"].Points.AddXY(data.m_strTable, (int)Config.ANALYSIS.RISK.HIGH);
				chart.Series["SeriesPotential"].Points.AddXY(data.m_strTable, (int)Config.ANALYSIS.RISK.POTENTIAL);
				chart.Series["SeriesNo"].Points.AddXY(data.m_strTable, (int)Config.ANALYSIS.RISK.NO);
			}

			m_CurSpring = strSpring;
		}

		public Bitmap CopyChart()
		{
			MemoryStream ms = new MemoryStream();
			chart.SaveImage(ms, ChartImageFormat.Bmp);
			Bitmap bm = new Bitmap(ms);
			return bm;
		}

		private void chart_MouseClick(object sender, MouseEventArgs e)
		{
			HitTestResult result = chart.HitTest(e.X, e.Y);
			if(result.ChartElementType == ChartElementType.AxisLabels &&
				result.Object != null)
			{
				string strTable = (string)result.Object;
				m_Owner.OnRadarSelectTable(strTable);
			}
		}
	}
}
