using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using InABox.Core;
using InABox.Wpf;
using InABox.WPF;
using Syncfusion.Windows.Shared;
using Xceed.Wpf.AvalonDock.Themes;
namespace InABox.DynamicGrid
{
///
/// Interaction logic for DynamicExportForm.xaml
///
public partial class DynamicExportForm : ThemableWindow
{
private readonly Type _entitytype;
public DynamicExportForm(Type entitytype, IEnumerable Selected)
{
InitializeComponent();
Fields = Array.Empty();
ChildMappings = new();
var codeProperty = EntityCode(entitytype);
if (codeProperty != null)
{
var m2mTypes = DynamicGridUtils.GetManyToManyTypes(entitytype)
.Where(x => x.GetInterfaces().Contains(typeof(IExportable)));
var o2mTypes = DynamicGridUtils.GetOneToManyTypes(entitytype)
.Where(x => x.GetInterfaces().Contains(typeof(IExportable)));
foreach(var type in m2mTypes)
{
var otherType = CoreUtils.GetManyToManyOtherType(type, entitytype);
var result = new Inflector.Inflector(new CultureInfo("en")).Pluralize(otherType.Name);
AddOtherTab(type, result);
}
foreach(var type in o2mTypes)
{
var caption = type.GetCustomAttribute(typeof(Caption));
var result = caption != null ?
((Caption)caption).Text :
new Inflector.Inflector(new CultureInfo("en")).Pluralize(type.Name);
AddOtherTab(type, result);
}
}
_entitytype = entitytype;
ShowHelpImage.Source = Properties.Resources.help.AsBitmapImage();
var mappings = ImportFactory.ExtractMappings(_entitytype, ImportMappingType.Export);
Mappings.HideBlank = true;
Mappings.Items.AddRange(mappings);
Mappings.Selected.AddRange(mappings.Where(x => x.Key || Selected.Contains(x.Property)));
Mappings.Refresh(true, true);
}
private DynamicExportMappingGrid CreateOtherTab(Type tabType)
{
var mappingsGrid = new DynamicExportMappingGrid();
var mappings = ImportFactory.ExtractMappings(tabType, ImportMappingType.Export);
mappingsGrid.HideBlank = true;
mappingsGrid.Items.AddRange(mappings);
mappingsGrid.Selected.Clear();
mappingsGrid.Refresh(true, true);
return mappingsGrid;
}
private void AddOtherTab(Type tabType, string caption)
{
var tab = new TabItem() { Header = caption };
var grid = CreateOtherTab(tabType);
ChildMappings[tabType] = grid;
tab.Content = grid;
TabControl.Items.Add(tab);
}
private DynamicExportMappingGrid CurrentMappings
{
get => (TabControl.SelectedContent as DynamicExportMappingGrid)!;
}
public string[] Fields { get; private set; }
private Dictionary ChildMappings;
private void ClearAll_Click(object sender, RoutedEventArgs e)
{
CurrentMappings.ClearAll();
}
private void SelectAll_Click(object sender, RoutedEventArgs e)
{
CurrentMappings.SelectAll();
}
private void HideBlank_Click(object sender, RoutedEventArgs e)
{
CurrentMappings.HideBlank = !CurrentMappings.HideBlank;
HideBlank.Content = CurrentMappings.HideBlank ? "Show All" : "Hide Blank";
CurrentMappings.Refresh(false, true);
}
private void Cancel_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
}
private void OK_Click(object sender, RoutedEventArgs e)
{
Fields = Mappings.Selected.Select(x => x.Property).ToArray();
DialogResult = true;
}
private void ShowHelp_Click(object sender, RoutedEventArgs e)
{
Process.Start(new ProcessStartInfo("https://prs-software.com.au/wiki/index.php/Export_Data") { UseShellExecute = true });
}
private IProperty? EntityCode(Type entityType)
{
foreach(var property in DatabaseSchema.Properties(entityType))
{
var editor = property.Editor;
if(editor is UniqueCodeEditor)
{
return property;
}
}
return null;
}
public Dictionary> GetChildFields()
{
return ChildMappings.ToDictionary(
x => x.Key,
x => x.Value.Selected.Select(x => x.Property));
}
}
}