using BackupEssentials.Backup;
using BackupEssentials.Backup.History;
using BackupEssentials.Sys;
using BackupEssentials.Utils;
using System;
using System.ComponentModel;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;

namespace BackupEssentials{
    public partial class BackupReportWindow : Window{
        public BackupReportWindow(BackupReport report){
            InitializeComponent();
            ReportTextBlock.Text = report == null || report.Report == null ? Settings.Default.Language["Report.FetchError"] : report.Report;
        }

        public BackupReportWindow(HistoryEntry entry){
            InitializeComponent();
            ReportTextBlock.Text = Settings.Default.Language["Report.Fetching"];

            Thread thread = new Thread(new ParameterizedThreadStart(LoadReportFileAsync));
            thread.Start(entry);
        }

        private void LoadReportFileAsync(object entry){
            BackupReport finalReport = null;
            string data = FileUtils.ReadFileCompressed(Path.Combine(HistoryEntry.Directory,((HistoryEntry)entry).Filename),FileMode.Open);
            
            if (data == null)data = Settings.Default.Language["Report.FetchError"];
            else{
                finalReport = new BackupReport(data);
                string _unused = finalReport.Report; // init and cache
            }

            Dispatcher.BeginInvoke(new Action<object>((d) => {
                BackupReport report = d as BackupReport;
                ReportTextBlock.Text = report != null ? report.Report : d as string;
            }),DispatcherPriority.Background,finalReport == null ? (object)data : (object)finalReport);
        }

        private void TitleBarLeftButtonDown(object sender, MouseButtonEventArgs e){
            DragMove();
        }

        private void ButtonWindowCloseClick(object sender, RoutedEventArgs e){
            Close();
        }
    }
}