using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Shapes.Charts;
using MigraDoc.Rendering;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ViewComponents.NotVisualComponents
{
	public partial class PieChartPDF : Component
	{
		public PieChartPDF()
		{
			InitializeComponent();
		}

		public PieChartPDF(IContainer container)
		{
			container.Add(this);

			InitializeComponent();
		}

		public bool CreatePieChart(DataForPDFPieChart dataForPDFPie)
		{
			// проверки
			if (string.IsNullOrEmpty(dataForPDFPie.FilePath) || string.IsNullOrEmpty(dataForPDFPie.DocumentTitle) || string.IsNullOrEmpty(dataForPDFPie.ChartTitle) 
				|| string.IsNullOrEmpty(dataForPDFPie.LegendName) 
				|| dataForPDFPie.Items.Count == 0) throw new ArgumentException("Недостаточно данных");

			Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

			Document _document = new Document();
			var section = _document.AddSection();
			var paragraph = section.AddParagraph(dataForPDFPie.DocumentTitle);
			paragraph.Format.Alignment = ParagraphAlignment.Center;
			paragraph.Format.SpaceAfter = "2cm";

			Chart chart = section.AddChart(ChartType.Pie2D);
			chart.Width = Unit.FromCentimeter(16);
			chart.Height = Unit.FromCentimeter(12);
			chart.HeaderArea.AddParagraph(dataForPDFPie.ChartTitle); // заголовок диаграммы

			Series series = chart.SeriesCollection.AddSeries();
			series.Name = dataForPDFPie.LegendName; // название сериии
			XSeries xseries = chart.XValues.AddXSeries();

			foreach ((double, string) el in dataForPDFPie.Items) // заполнение серии
			{
				series.Add(el.Item1);
				xseries.Add(el.Item2);
			}

			switch (dataForPDFPie.diagLegend) // позиция легенды
			{
				case DiagramLegendEnum.Top:
					chart.TopArea.AddLegend();
					break;
				case DiagramLegendEnum.Bottom:
					chart.BottomArea.AddLegend();
					break;
				case DiagramLegendEnum.Right:
					chart.RightArea.AddLegend();
					break;
				case DiagramLegendEnum.Left:	
					chart.LeftArea.AddLegend();
					break;
			}

			chart.DataLabel.Type = DataLabelType.Percent;
			chart.DataLabel.Position = DataLabelPosition.OutsideEnd;

			PdfDocumentRenderer renderer = new PdfDocumentRenderer(true);
			renderer.Document = _document;
			renderer.RenderDocument();
			renderer.PdfDocument.Save(dataForPDFPie.FilePath);

			return true;
		}
	}
}