using FLY.Thick.FilmCasting.UI.DbViewer.Core;
using MahApps.Metro.Controls.Dialogs;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Unity;

namespace FLY.Thick.FilmCasting.UI.DbViewer
{
    /// <summary>
    /// PageMain.xaml 的交互逻辑
    /// </summary>
    public partial class PgMain : Page
    {
        IUnityContainer container;
        DbViewerModel dbViewerModel;

        public PgMain()
        {
            InitializeComponent();
        }
        [Unity.InjectionMethod]
        public void Init(IUnityContainer container, DbViewerModel dbViewerModel)
        {
            this.container = container;
            this.dbViewerModel = dbViewerModel;
            this.DataContext = dbViewerModel;
        }
        private void ButtonSelect_Click(object sender, RoutedEventArgs e)
        {
            PgSelect p = new PgSelect();
            container.BuildUp(p);
            this.NavigationService.Navigate(p);
        }

        private void ButtonChart_Click(object sender, RoutedEventArgs e)
        {

        }

        private async void ButtonExcel_Click(object sender, RoutedEventArgs e)
        {
            string strDesktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

            //导出一个文件夹

            System.Windows.Forms.FolderBrowserDialog open = new System.Windows.Forms.FolderBrowserDialog();

            open.SelectedPath = strDesktopPath;

            if (open.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                ExcelOuput ouput = new ExcelOuput();

                controller = await App.MetroWindow.ShowProgressAsync("请等待...", "开始导出",
                    settings: new MetroDialogSettings()
                    {
                        NegativeButtonText = "停止",
                        AnimateShow = false,
                        AnimateHide = false,

                    });
                //controller.SetCancelable(true);
                controller.SetIndeterminate();

                string dirPath = System.IO.Path.Combine(open.SelectedPath, $"流延记录_{DateTime.Now:yyyyMMddHHmmss}");
                //创建文件夹
                System.IO.Directory.CreateDirectory(dirPath);

                ouput.PropertyChanged += Ouput_PropertyChanged;
                for (int i = 0; i < dbViewerModel.ProfilePacks.Count(); i++) {

                    var pack = dbViewerModel.ProfilePacks[i];
                    string fileName = $"{pack.Profile.PName}-{pack.Profile.Batch}-{pack.Profile.Number}-{pack.Profile.ID}.xlsx";
                    fileName = MakeFileNameValid(fileName);
                    
                    string filePath = System.IO.Path.Combine(dirPath, fileName);
                    await ouput.SaveToXlsx(filePath, pack);
                }
                ouput.PropertyChanged -= Ouput_PropertyChanged;

                await controller.CloseAsync();
                controller = null;

                await App.MetroWindow.ShowMessageAsync("输出成功",
                    open.SelectedPath);
            }
        }
        string MakeFileNameValid(string fileName) 
        {

            StringBuilder sb = new StringBuilder(fileName);
            //不能让它有特殊符合
            var invalidChars = System.IO.Path.GetInvalidFileNameChars();
            for (int j = 0; j < sb.Length; j++)
            {
                if (invalidChars.Contains(sb[j]))
                    sb[j] = 'x';
            }
            fileName = sb.ToString();
            return fileName;
        }
        ProgressDialogController controller;
        private void Ouput_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            var output = sender as ExcelOuput;
            if ((e.PropertyName == nameof(ExcelOuput.Progress)) ||
                (e.PropertyName == nameof(ExcelOuput.Msg)))
            {
                controller.SetProgress(output.Progress);
                controller.SetMessage(output.Msg);
            }
        }


        private void ButtonSetup_Click(object sender, RoutedEventArgs e)
        {
            PgSetup p = new PgSetup();
            container.BuildUp(p);
            this.NavigationService.Navigate(p);
        }
    }
}