using Components; using Components.NonVisual; using Components.SaveToPdfHelpers; using NPOI.HPSF; using PluginsConventionLibrary; using PortalAccountsBusinessLogic.BusinessLogics; using PortalAccountsContracts.BindingModels; using PortalAccountsContracts.BusinessLogicsContracts; using PortalAccountsContracts.ViewModels; using PortalAccountsDatabaseImplement.Implements; using PutincevLibrary; using RodionovLibrary.NonVisualComponents; using RodionovLibrary.NonVisualComponents.HelperModels; using System.Text; namespace PortalAccountsView { public class PluginsConvention : IPluginsConvention { private readonly IAccountLogic _accountLogic; private readonly IInterestLogic _interestLogic; private readonly CustomDataGridView _customDataGridViewTable = new(); private readonly ComponentExcelWithImage _componentExcelWithImage = new(); private readonly WordTableComponent _wordTableComponent = new(); private readonly HistogramPDF _histogrampdf = new(); public PluginsConvention() { _accountLogic = new AccountLogic(new AccountStorage()); _interestLogic = new InterestLogic(new InterestStorage()); ReloadData(); } public string PluginName => "LabWork3 Plugin"; public UserControl GetControl => _customDataGridViewTable; public PluginsConventionElement GetElement { get { var selected = _customDataGridViewTable.GetSelectedObject() ?? throw new Exception("Не удалось получить выбранный элемент"); return new PluginsConventionAccount() { Id = IntToGuid(selected.Id), Login = selected.Login, AvatarPath = selected.AvatarPath, InterestName = selected.InterestName, Email = selected.Email }; } } public Form GetForm(PluginsConventionElement element) { var formAccount = new FormAccount(_accountLogic, _interestLogic); if (element != null) { formAccount.Id = element.Id.GetHashCode(); } return formAccount; } public Form GetThesaurus() { return new FormInterests(_interestLogic); } public bool DeleteElement(PluginsConventionElement element) { return _accountLogic.Delete( new AccountBindingModel { Id = element.Id.GetHashCode() } ); } public void ReloadData() { try { var accounts = _accountLogic.ReadList(null) ?? throw new Exception("Не удалось получить список аккаунтов"); _customDataGridViewTable.ClearRows(); var tables = new List<(string, string, float)> { ("Идентификатор", "Id", 1), ("Логин", "Login", 1), ("Интерес", "InterestName", 2), ("Почта", "Email", 2) }; _customDataGridViewTable.ConfigureColumns(tables); _customDataGridViewTable.FillData(accounts); } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } public bool CreateSimpleDocument(PluginsConventionSaveDocument saveDocument) { try { List images = new List(); var list = _accountLogic.ReadList(null); if (list != null) { foreach (var item in list) { images.Add(item.AvatarPath); } string[] imagesArray = images.ToArray(); _componentExcelWithImage.CreateExcelWithImages(saveDocument.FileName, "Сканы чеков", imagesArray); } return true; } catch (Exception) { return false; } } public bool CreateTableDocument(PluginsConventionSaveDocument saveDocument) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); try { string title = "Документ с таблицей"; var mergedColumns = new List<(int, int)> { (1, 2), }; var columns = new List { new() { FirstRowHeader = "Идент", PropertyName = "Id", Width = 1.3 }, new() { FirstRowHeader = "Личные данные", SecondRowHeader = "Логин", PropertyName = "Login", Width = 1.7 }, new() { FirstRowHeader = "Личные данные", SecondRowHeader = "Почта", PropertyName = "Email", Width = 1.7 }, new() { FirstRowHeader = "Интерес", PropertyName = "InterestName", Width = 1.7 }, }; var list = _accountLogic.ReadList(null); var tableInfo = new WordTableInfo { FileName = saveDocument.FileName, Title = title, ColumnParameters = columns, Items = list, MergedColumns = mergedColumns }; _wordTableComponent.CreateTable(tableInfo); return true; } catch (Exception) { return false; } } public bool CreateChartDocument(PluginsConventionSaveDocument saveDocument) { try { var accounts = _accountLogic.ReadList(null); var list = new ChartData(); var groupedAccounts = accounts.GroupBy(account => account.InterestName) .Select(group => new { InterestName = group.Key, AccountCount = group.Count() }) .ToList(); var data = new Dictionary(); foreach (var group in groupedAccounts) { data.Add(group.InterestName, (double)group.AccountCount); } list.Data = data; list.SeriesName = "Пользователи"; var acc = new List(); acc.Add(list); var histogrammInfo = new HistogramData { FilePath = saveDocument.FileName, DocumentTitle = "Гистограмма PDF", ChartTitle = "Количетсво интересов у пользователей", LegendPosition = LegendPositions.Bottom, ChartData = acc, }; _histogrampdf.CreateHistogramPdf(histogrammInfo); return true; } catch (Exception) { return false; } } private Guid IntToGuid(int value) { byte[] bytes = new byte[16]; BitConverter.GetBytes(value).CopyTo(bytes, 0); return new Guid(bytes); } } }