using log4net;
using PdmSwPlugin.Commmon.Control;
using PdmSwPlugin.Commmon.Util.UI;
using PdmSwPlugin.Common;
using PdmSwPlugin.Common.Entity.DrawAudit;
using PdmSwPlugin.Common.Entity.Pdm;
using PdmSwPlugin.Common.Interface;
using PdmSwPlugin.Common.Setting;
using PdmSwPlugin.Common.Util;
using PdmSwPlugin.Common.Util.Http;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace PdmSwPlugin.DrawApprove
{
    /// 
    /// UserControl1.xaml 的交互逻辑
    /// 
    [PdmSwPlugin(Title = "图纸审批")]
    public partial class DrawApproveControl : UserControl, ISwAppSetter, INotifyPropertyChanged
    {
        #region ...
        public virtual event PropertyChangedEventHandler PropertyChanged;
        public virtual void RaisePropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        public void RaiseAndSetIfChanged(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                RaisePropertyChanged(propertyName);
            }
        }
        #endregion
        private static ILog Logger = LogManager.GetLogger("DrawApprove");
        SldWorks SwApp;
        SldWorks ISwAppSetter.SwApp => SwApp;
        private readonly HttpClient Client;
        private HttpClientCreator clientCreator { get; set; }
        /// 
        /// 全部BOM树状结构
        /// 
        private ObservableCollection _dataSource = new ObservableCollection();
        public ObservableCollection dataSource
        {
            get => _dataSource;
            set => RaiseAndSetIfChanged(ref _dataSource, value);
        }
        public DrawApproveControl() : this(null)
        {
        }
        public DrawApproveControl(SldWorks swAddin)
        {
            SwApp = swAddin;
            InitializeComponent();
            clientCreator = new HttpClientCreator(new HttpConfig(PluginSetting.Instance.BaseAddress));
            Client = clientCreator.GetClient();
            DataContext = this;
        }
        public void SetSwApp(SldWorks SwApp)
        {
            this.SwApp = SwApp;
        }
        /// 
        /// 全选事件
        /// 
        /// 
        /// 
        private void GlobalCheckBox_Checked(object sender, RoutedEventArgs e)
        {
            CheckBox cb = sender as CheckBox;
            List datas = dataSource.ToList();
            foreach (DrawAudit data in datas)
            {
                data.selected = cb.IsChecked.Value;
            }
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MaskAdorner.ShowMask(content, "请求中,请稍后...");
            Task.Run(() =>
            {
                try
                {
                    List datas = RefreshList();
                    Dispatcher.Invoke(() =>
                    {
                        dataSource = new ObservableCollection(datas);
                    });
                }
                catch (Exception ex)
                {
                    Logger.Error("UI update failed.", ex);
                    this.Error($"UI更新列表失败!异常:{ex}");
                    dataSource = new ObservableCollection();
                }
                finally
                {
                    MaskAdorner.HideMask(content);
                }
            });
        }
        private void OpenDocMayError(string filePath, int docType, int option, string config)
        {
            int err = 0, warn = 0;
            SwApp.OpenDoc6(filePath, docType, option, config, ref err, ref warn);
            if (err == (int)swFileLoadError_e.swAddinInteruptError)
            {
                this.Error("打开失败!用户尝试打开文件,然后中断打开文件例程以打开其他文件");
            }
            else if (err == (int)swFileLoadError_e.swApplicationBusy)
            {
                this.Error("打开失败!Solidworks繁忙");
            }
            else if (err == (int)swFileLoadError_e.swFileCriticalDataRepairError)
            {
                this.Error("打开失败!文档存在严重数据损坏");
            }
            else if (err == (int)swFileLoadError_e.swFileNotFoundError)
            {
                this.Error("打开失败!无法找到文件;未加载文件或禁止显示引用的文件(即组件)");
            }
            else if (err == (int)swFileLoadError_e.swFileRequiresRepairError)
            {
                this.Error("打开失败!文档具有非关键自定义属性数据损坏");
            }
            else if (err == (int)swFileLoadError_e.swFutureVersion)
            {
                this.Error("打开失败!文档已保存在 SOLIDWORKS 的未来版本中");
            }
            else if (err == (int)swFileLoadError_e.swInvalidFileTypeError)
            {
                this.Error("打开失败!文件类型参数无效");
            }
            else if (err == (int)swFileLoadError_e.swLiquidMachineDoc)
            {
                this.Error("打开失败!由 Liquid Machines 加密的文件");
            }
            else if (err == (int)swFileLoadError_e.swLowResourcesError)
            {
                this.Error("打开失败!文件被打开并被阻止,因为系统内存不足,或者 GDI 句柄数已超过允许的最大值");
            }
            else if (err == (int)swFileLoadError_e.swNoDisplayData)
            {
                this.Error("打开失败!文件不包含显示数据");
            }
            else if (err == (int)swFileLoadError_e.swFileWithSameTitleAlreadyOpen)
            {
                this.Error("打开失败!具有相同名称的文档已打开");
                //SwApp.ActivateDoc3(filePath, false, 0, ref err);
                //if (err == 2)
                //{
                //    this.Error("需要重新生成已激活的文档");
                //}
                //else if (err == 1)
                //{
                //    this.Error("遇到不明错误,并且未激活文档");
                //}
            }
            else if (err != 0)
            {
                Logger.Error($"OpenDoc6 Failed,Error:{err}.See Solidworks Doc.");
            }
            else if (warn == 128)
            {
                SwApp.ActivateDoc3(filePath, false, 0, ref err);
                if (err == 2)
                {
                    this.Error("需要重新生成已激活的文档");
                }
                else if (err == 1)
                {
                    this.Error("遇到不明错误,并且未激活文档");
                }
            }
        }
        private void OpenDrw_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            DrawAudit da = btn.DataContext as DrawAudit;
            string fileName = Path.GetFileName(da.d2RelativePath);
            if (string.IsNullOrEmpty(fileName))
            {
                this.Error("无效文件名");
                return;
            }
            fileName = Path.Combine(PluginSetting.Instance.SwFilePath, fileName);
            if (!File.Exists(fileName))
            {
                this.Error($"服务器中未找到工程图文件,路径:{fileName}");
                return;
            }
            OpenDocMayError(fileName, (int)swDocumentTypes_e.swDocDRAWING, (int)swOpenDocOptions_e.swOpenDocOptions_ReadOnly,
                "");
        }
        private void OpenDoc_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            DrawAudit da = btn.DataContext as DrawAudit;
            string fileName = Path.GetFileName(da.d3RelativePath);
            if (string.IsNullOrEmpty(fileName))
            {
                this.Error("无效文件名");
                return;
            }
            fileName = Path.Combine(PluginSetting.Instance.SwFilePath, fileName);
            if (!File.Exists(fileName))
            {
                this.Error($"服务器中未找到工程图文件,路径:{fileName}");
                return;
            }
            OpenDocMayError(fileName, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_ReadOnly,
                 "");
        }
        public List RefreshList()
        {
            try
            {
                Result> res = Client.GetSyncAction>("drawAudit/listWithTask");
                return res.HandleResult();
            }
            catch (Exception ex)
            {
                Logger.Error("Get draw audit data list failed.", ex);
                this.Error($"刷新列表失败!异常:{ex.Message}");
                return new List();
            }
        }
        public void CloseAuditedDoc(DrawAudit da)
        {
            try
            {
                string modelPath = Path.Combine(PluginSetting.Instance.SwFilePath, Path.GetFileName(da.d3RelativePath));
                string drawingPath = Path.Combine(PluginSetting.Instance.SwFilePath, Path.GetFileName(da.d2RelativePath));
                SwApp.CloseDoc(modelPath);
                SwApp.CloseDoc(drawingPath);
            }
            catch (Exception exx)
            {
                Logger.Error("Auto close open doc failed.", exx);
            }
        }
        /// 
        /// 单条数据通过按钮点击事件
        /// 
        /// 
        /// 
        private void Resolve_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            DrawAudit da = btn.DataContext as DrawAudit;
            if (da.status != "submitted" && da.status != "resubmitted")
            {
                this.Warning("请选择已提交的数据");
                return;
            }
            MessageBoxResult mr = MessageBox.Show($"确定通过物料【{da.materialCode}】的图纸审批吗?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Question);
            if (mr == MessageBoxResult.OK)
            {
                MaskAdorner.ShowMask(content, "请求中,请稍候...");
                Task.Run(() =>
                {
                    try
                    {
                        da.pass = true;
                        Result