using InABox.Core;
using InABox.Wpf;
using NPOI.HPSF;
using System;
using System.IO;
using System.Reactive;
using System.Windows;
using InABox.WPF;
using InABox.Clients;
using System.Linq;
using System.Diagnostics.CodeAnalysis;
namespace InABox.DynamicGrid
{
///
/// Interaction logic for DocumentConfirm.xaml
///
public partial class DocumentConfirm : ThemableWindow
{
public DocumentConfirm()
{
InitializeComponent();
}
public string FileName { get; set; }
public DateTime LocalTimeStamp { get; set; }
public DateTime RemoteTimeStamp { get; set; }
public int LocalSize { get; set; }
public int RemoteSize { get; set; }
public DocumentAction Result { get; set; }
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Header.Content = string.Format("A file named [{0}] already exists on the server!", FileName);
NewTimeStamp.Content = string.Format("{0:dd MMM yy HH:mm:ss}", LocalTimeStamp);
OldTimeStamp.Content = string.Format("{0:dd MMM yy HH:mm:ss}", RemoteTimeStamp);
OldSize.Content = string.Format("{0:n0}", RemoteSize);
NewSize.Content = string.Format("{0:n0}", LocalSize);
Result = DocumentAction.MakeCopy;
}
private void ReplaceButton_Click(object sender, RoutedEventArgs e)
{
Result = DocumentAction.Replace;
DialogResult = true;
Close();
}
private void ExistingButton_Click(object sender, RoutedEventArgs e)
{
Result = DocumentAction.UseExisting;
DialogResult = true;
Close();
}
private void MakeCopyButton_Click(object sender, RoutedEventArgs e)
{
Result = DocumentAction.MakeCopy;
DialogResult = true;
Close();
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
Close();
}
public static Document? CheckDocument(Document newDocument, Func? findDocument, out bool shouldSave)
{
Document? existing = null;
using (new WaitCursor())
existing = findDocument?.Invoke(newDocument.FileName);
if (existing != null)
{
if ((existing.TimeStamp == DateTime.MinValue || existing.TimeStamp.ToString("yyyy-MM-ddThh:mm.ss.fff")
.Equals(newDocument.TimeStamp.ToString("yyyy-MM-ddThh:mm.ss.fff"))) && existing.CRC.Equals(newDocument.CRC))
{
if (existing.TimeStamp == DateTime.MinValue)
{
existing.TimeStamp = newDocument.TimeStamp;
shouldSave = true;
}
else
{
shouldSave = false;
}
return existing;
}
else
{
var confirm = new DocumentConfirm
{
FileName = newDocument.FileName,
LocalSize = newDocument.Data.Length,
RemoteSize = existing.Data.Length,
LocalTimeStamp = newDocument.TimeStamp,
RemoteTimeStamp = existing.TimeStamp
};
if (confirm.ShowDialog() == true)
{
if (confirm.Result == DocumentAction.Replace)
{
existing.Data = newDocument.Data;
existing.TimeStamp = newDocument.TimeStamp;
existing.CRC = newDocument.CRC;
shouldSave = true;
return existing;
}
else if (confirm.Result == DocumentAction.UseExisting)
{
shouldSave = false;
return existing;
}
else if (confirm.Result == DocumentAction.MakeCopy)
{
using (new WaitCursor())
{
var basefilename = Path.GetFileNameWithoutExtension(newDocument.FileName);
var ext = Path.GetExtension(newDocument.FileName);
var i = 0;
while (existing is not null)
{
i++;
newDocument.FileName = Path.ChangeExtension(string.Format("{0} ({1})", basefilename, i), ext);
existing = findDocument?.Invoke(newDocument.FileName);
}
}
shouldSave = true;
return newDocument;
}
}
}
}
else
{
shouldSave = true;
return newDocument;
}
shouldSave = false;
return null;
}
}
}