using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using Kingo.PluginServiceInterface.Model;
using KUI.Windows;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
namespace Kingo.PluginServiceInterface.WizardFramework
{
    /// 
    /// WizardWindow.xaml 的交互逻辑
    /// 
    public partial class WizardWindow : BaseWindow
    {
        #region 字段
        /// 
        /// 状态标志位
        /// 
        public enum WizardState
        {
            /// 
            /// 未初始化
            /// 
            Uninitialized,
            /// 
            /// 启动状态
            /// 
            Start,
            /// 
            /// 中间状态
            /// 
            Middle,
            /// 
            /// 结束状态
            /// 
            End,
        }
        /// 
        /// 向导模式
        /// 
        public enum WizardModel
        {
            /// 
            /// 分步执行模式
            /// 
            SimpleModel,
            /// 
            /// 分步设置一键执行模式
            /// 
            StepSettingModel,
            /// 
            /// 一键执行模式
            /// 
            OneKeyModel,
        }
        /// 
        /// 记录当前步骤
        /// 
        private int m_currentSetp;
        /// 
        /// 记录向导状态
        /// 
        private WizardState m_state;
        /// 
        /// 记录向导模式
        /// 
        private WizardModel m_model;
        private ListCollectionView m_view;
        List m_WizardSteps = new List();
        #endregion
        #region 属性
        /// 
        /// 向导状态
        /// 
        public WizardState State
        {
            get { return m_state; }
        }
        /// 
        /// 向导模式
        /// 
        public WizardModel Model
        {
            get { return m_model; }
            set { m_model = value; }
        }
        #region
        private string m_prefilishBtnName = "完成";
        private bool m_isSucessFinsh = false;//在新一轮里是否成功的执行完成
        private string m_finishBtnName = "完成";
        /// 
        /// 根据需要改变完成按钮,执行完了名字变回“完成”
        /// 
        public string FinishBtnName
        {
            get { return m_finishBtnName; }
            set
            {
                m_prefilishBtnName = m_finishBtnName;
                m_finishBtnName = value;
                this.btnFinish.Content = m_finishBtnName;
            }
        }
        #endregion
        #endregion
        /// 
        /// 构造函数
        /// 
        public WizardWindow()
        {
            InitializeComponent();
            m_currentSetp = -1;
            m_state = WizardState.Uninitialized;
            PluginArea.Children.Clear();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //ThemeManager.SetThemeName(this, "Office2013LightGray");
            ++m_currentSetp;
            SetWizardMode();
            SetState();
            ButtonState();
            lstSetpCaption.DataContext = m_WizardSteps;
            m_view = (ListCollectionView)CollectionViewSource.GetDefaultView(lstSetpCaption.DataContext);
            m_view.CurrentChanged += new EventHandler(view_CurrentChanged);
            MoveNext(m_currentSetp);
        }
        void view_CurrentChanged(object sender, EventArgs e)
        {
            lstSetpCaption.SelectedIndex = m_view.CurrentPosition;
        }
        /// 
        /// 添加向导步骤
        /// 
        /// 
        public void AddStepControl(IWizardFramework pWF)
        {
            m_WizardSteps.Add(pWF);
        }
        /// 
        ///向导模式 
        /// 
        private void SetWizardMode()
        {
            switch (this.m_model)
            {
                case WizardModel.SimpleModel:
                    this.btnExecute.Visibility = Visibility.Collapsed;
                    break;
                case WizardModel.StepSettingModel:
                    this.btnExecute.Visibility = Visibility.Collapsed;
                    break;
                case WizardModel.OneKeyModel:
                    this.btnMovePrevious.Visibility = Visibility.Hidden;
                    this.btnMoveNext.Visibility = Visibility.Hidden;
                    this.btnFinish.Visibility = Visibility.Hidden;
                    break;
            }
        }
        /// 
        /// 判断PlugList列表是否为空
        /// 
        /// 
        private bool IsValidate()
        {
            if (m_WizardSteps.Count != 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #region 按钮方法
        #region 添加
        /// 
        /// 上一步
        /// 
        /// 
        private void MoveToFirstView()
        {
            if (m_currentSetp == 0)
            {
                return;
            }
            --m_currentSetp;
            SetState();
            ButtonState();
            if (m_currentSetp > -1 && m_currentSetp <= m_WizardSteps.Count - 1)
            {
                this.PluginArea.Children.Clear();
                this.FinishBtnName = m_prefilishBtnName;
                m_WizardSteps[m_currentSetp].Intializing();
                this.PluginArea.Children.Add((UIElement)m_WizardSteps[0]);
                this.lblWizardCaption.Content = m_WizardSteps[0].Caption;
                this.txtDescription.Text = m_WizardSteps[0].Description;
                m_currentSetp = 0;
            }
            else
            {
                return;
            }
        }
        #endregion
        /// 
        /// 上一步
        /// 
        /// 
        private void MovePrevious()
        {
            if (m_currentSetp == 0)
            {
                return;
            }
            --m_currentSetp;
            SetState();
            ButtonState();
            //************************************************//
            //this.MoveNext(m_currentSetp);
            if (m_currentSetp > -1 && m_currentSetp <= m_WizardSteps.Count - 1)
            {
                this.PluginArea.Children.Clear();
                //m_WizardSteps[m_currentSetp].Intializing();
                this.PluginArea.Children.Add((UIElement)m_WizardSteps[m_currentSetp]);
                this.lblWizardCaption.Content = m_WizardSteps[m_currentSetp].Caption;
                this.txtDescription.Text = m_WizardSteps[m_currentSetp].Description;
                //**************修改**********************************//
                if (this.m_isSucessFinsh)//点击执行成功后放回,则进入下一轮执行期
                {
                    this.FinishBtnName = m_prefilishBtnName;
                    this.m_isSucessFinsh = false;
                }
            }
            else
            {
                return;
            }
            //************************************************//
        }
        /// 
        /// 下一步
        /// 
        /// 
        private void MoveNext(int currentStep)
        {
            if (m_currentSetp > -1 && m_currentSetp <= m_WizardSteps.Count - 1)
            {
                this.PluginArea.Children.Clear();
                m_WizardSteps[m_currentSetp].Intializing();
                this.PluginArea.Children.Add((UIElement)m_WizardSteps[m_currentSetp]);
                this.lblWizardCaption.Content = m_WizardSteps[m_currentSetp].Caption;
                this.txtDescription.Text = m_WizardSteps[m_currentSetp].Description;
            }
            else
            {
                return;
            }
        }
        /// 
        /// 取消
        /// 
        private void Cancel()
        {
            System.Windows.Forms.DialogResult result = MessageHelper.ShowYesNoAndTips("是否要确实退出该向导操作?");
            bool dResult = (result == System.Windows.Forms.DialogResult.Yes);
            if (dResult)
            {
                PluginArea.Children.Clear();
                Close();
            }
        }
        /// 
        /// 完成
        /// 
        private bool Finish()
        {
            m_isSucessFinsh = false;
            if (!IsValidate()) return false;
            if (m_WizardSteps[m_currentSetp].Validating())
            {
                //this.Cursor = Cursors.Wait;
                this.btnMovePrevious.IsEnabled = false;
                this.btnFinish.IsEnabled = false;
                this.btnExecute.IsEnabled = false;
                if (m_WizardSteps[m_currentSetp] is IWizardFrameworkExeState)
                {
                    (m_WizardSteps[m_currentSetp] as IWizardFrameworkExeState).ExeStateCallBacK = (p) =>
                    {
                        if (p is ExeState)
                        {
                            switch (p)
                            {
                                case ExeState.Start:
                                    this.btnMovePrevious.IsEnabled = false;
                                    this.btnFinish.IsEnabled = false;
                                    this.btnExecute.IsEnabled = false;
                                    this.btnSkip.IsEnabled = false;
                                    this.btnMoveNext.IsEnabled = false;
                                    this.btnCancel.IsEnabled = false;
                                    break;
                                case ExeState.Fail:
                                    this.btnMovePrevious.IsEnabled = true;
                                    this.btnFinish.IsEnabled = true;
                                    this.btnExecute.IsEnabled = true;
                                    break;
                                case ExeState.Success:
                                    this.btnMovePrevious.IsEnabled = true;
                                    this.btnFinish.IsEnabled = true;
                                    this.btnExecute.IsEnabled = true;
                                    break;
                                default:
                                    break;
                            }
                        }
                    };
                }
                if (m_WizardSteps[m_currentSetp].Execute())
                {
                    //this.btnMovePrevious.IsEnabled = true;
                    //this.btnFinish.IsEnabled = true;
                    //this.btnExecute.IsEnabled = true;
                    if (m_WizardSteps[m_currentSetp].IsFinalSuccess)
                    {
                        //MessageBoxResult result = MessageBox.Show("向导运行成功,是否关闭该向导", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question);
                        //bool dResult = (result == MessageBoxResult.Yes);
                        //if (dResult)
                        //{
                        //    PluginArea.Children.Clear();
                        //    Close();
                        //}
                        return true;
                    }
                    else
                    {
                        //MessageBoxResult result = MessageBox.Show("向导运行失败,是否继续该向导", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question);
                        //bool dResult = (result == MessageBoxResult.Yes);
                        System.Windows.Forms.DialogResult result = MessageHelper.ShowYesNoAndError("向导运行失败,是否继续该向导?");
                        bool dResult = (result == System.Windows.Forms.DialogResult.Yes);
                        if (!dResult)
                        {
                            PluginArea.Children.Clear();
                            Close();
                        }
                    }
                }
            }
            return false;
            //else
            //{
            //    MessageBox.Show("信息不能为空,请选择!", "提示");
            //}
            //this.Cursor = Cursors.Arrow;
        }
        private bool FinishAll()
        {
            try
            {
                #region 验证最后一步是否可执行
                var Lastitem = m_WizardSteps.FindLast(x => x.Validating());
                //if (!Lastitem.IsFinalSuccess)
                //    return false;
                TextBox txtlog = Lastitem.Parameter as TextBox;
                Lastitem.Parameter = null;
                #endregion
                m_isSucessFinsh = false;
                if (!IsValidate()) return false;
                this.btnMovePrevious.IsEnabled = false;
                this.btnFinish.IsEnabled = false;
                this.btnExecute.IsEnabled = false;
                IDGParameter iDGParameter = null;
                bool isExeGPForProces = false;
                //this.ShowLoading("正在执行请稍候...", 0, 0);
                foreach (var item in m_WizardSteps)
                {
                    if (item.IsSkip) continue;
                    if (item.Parameter != null)
                    {
                        if (iDGParameter == null)
                        {
                            iDGParameter = new IDGParameter();
                            iDGParameter.StrProjInfo = (item.Parameter as IDGParameter).StrProjInfo;
                        }
                        if ((item.Parameter as IDGParameter).ExeDLTB)
                        {
                            iDGParameter.ExeDLTB = true;
                        }
                        if ((item.Parameter as IDGParameter).ExeCJDCQ || (item.Parameter as IDGParameter).ExeXZQ || (item.Parameter as IDGParameter).ExeGDDB)
                        {
                            iDGParameter.ExeCJDCQ = (item.Parameter as IDGParameter).ExeCJDCQ == true;
                            iDGParameter.ExeXZQ = (item.Parameter as IDGParameter).ExeXZQ == true;
                            iDGParameter.ExeGDDB = (item.Parameter as IDGParameter).ExeGDDB == true;
                        }
                        if ((item.Parameter as IDGParameter).ExeCZC)
                        {
                            iDGParameter.ExeCZC = (item.Parameter as IDGParameter).ExeCZC == true;
                        }
                        if ((item.Parameter as IDGParameter).ExeZLHZ)
                        {
                            iDGParameter.ExeZLHZ = (item.Parameter as IDGParameter).ExeZLHZ == true;
                        }
                    }
                    else
                    {
                        if (iDGParameter != null && isExeGPForProces == false)
                        {
                            string result = ProcesHelper.Instance.ExeGPForProces(iDGParameter, txtlog);
                            if (result.Contains("Err"))
                            {
                                MessageHelper.ShowTips($"执行失败!:{result}");
                                return false;
                            }
                            isExeGPForProces = true;
                        }
                        if (item.Execute())
                        {
                        }
                        else
                        {
                            LogAPI.Debug("执行失败");
                            MessageHelper.ShowTips("执行失败!");
                            return true;
                        }
                    }
                    //Thread.Sleep(2000);
                }
                //this.CloseLoading();
                MessageHelper.ShowTips("执行完成!");
                this.btnMovePrevious.IsEnabled = true;
                this.btnFinish.IsEnabled = true;
                this.btnExecute.IsEnabled = true;
                return true;
            }
            catch (Exception ex)
            {
                //this.CloseLoading();
                LogAPI.Debug("执行失败");
                MessageHelper.ShowError(ex.Message);
            }
            finally
            {
                //this.CloseLoading();
            }
            return false;
        }
        #endregion
        #region 向导状态
        /// 
        /// 设置当前向导状态
        /// 
        protected void SetState()
        {
            if (m_WizardSteps.Count == 0)
            {
                m_state = WizardState.Uninitialized;
            }
            else if (m_WizardSteps.Count - 1 == m_currentSetp)
            {
                m_state = WizardState.End;
            }
            else if (m_currentSetp == 0)
            {
                m_state = WizardState.Start;
            }
            else
            {
                m_state = WizardState.Middle;
            }
        }
        /// 
        /// 设置Button状态
        /// 
        /// 
        /// 
        protected void SetButtonState(Button btn, bool isEnabled)
        {
            if (btn != null)
            {
                btn.IsEnabled = isEnabled;
            }
        }
        /// 
        /// 监听当前向导状态
        /// 
        protected void ButtonState()
        {
            switch (this.State)
            {
                case WizardState.Uninitialized:
                    SetButtonState(this.btnMovePrevious, false);
                    SetButtonState(this.btnMoveNext, false);
                    SetButtonState(this.btnFinish, false);
                    SetButtonState(this.btnSkip, false);
                    SetButtonState(this.btnCancel, true);
                    break;
                case WizardState.Start:
                    SetButtonState(this.btnMovePrevious, false);
                    SetButtonState(this.btnMoveNext, true);
                    SetButtonState(this.btnFinish, false);
                    SetButtonState(this.btnSkip, true);
                    SetButtonState(this.btnCancel, true);
                    break;
                case WizardState.Middle:
                    SetButtonState(this.btnMovePrevious, true);
                    SetButtonState(this.btnMoveNext, true);
                    SetButtonState(this.btnSkip, true);
                    SetButtonState(this.btnFinish, false);
                    SetButtonState(this.btnCancel, true);
                    break;
                case WizardState.End:
                    SetButtonState(this.btnMovePrevious, true);
                    SetButtonState(this.btnMoveNext, false);
                    SetButtonState(this.btnSkip, false);
                    SetButtonState(this.btnFinish, true);
                    SetButtonState(this.btnCancel, true);
                    break;
            }
        }
        #endregion
        private void btnMoveNext_Click(object sender, RoutedEventArgs e)
        {
            if (!IsValidate()) return;
            if (m_WizardSteps[m_currentSetp].Validating())
            {
                this.Cursor = Cursors.Wait;
                if (this.Model == WizardModel.SimpleModel)
                {
                    if (m_WizardSteps[m_currentSetp].Execute())
                    {
                        ++m_currentSetp;
                        SetState();
                        ButtonState();
                        this.MoveNext(m_currentSetp);
                        m_view.MoveCurrentToNext();//ListBoxItem向下移动一次
                    }
                    else
                    {
                        return;
                    }
                }
                else if (this.Model == WizardModel.StepSettingModel)
                {
                    ++m_currentSetp;
                    SetState();
                    ButtonState();
                    this.MoveNext(m_currentSetp);
                    m_view.MoveCurrentToNext();//ListBoxItem向下移动一次
                }
            }
            //else
            //{
            //    MessageBox.Show("信息不能为空,请选择!", "提示");
            //}
            this.Cursor = Cursors.Arrow;
        }
        private void btnMovePrevious_Click(object sender, RoutedEventArgs e)
        {
            //************************************************//
            m_WizardSteps[m_currentSetp].Back();
            //************************************************//
            MovePrevious();
            m_view.MoveCurrentToPrevious();
        }
        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            Cancel();
        }
        private void btnFinish_Click(object sender, RoutedEventArgs e)
        {
            if (m_isSucessFinsh)
            {
                Close();
                return;
            }
            this.Cursor = Cursors.Wait;
            switch (this.Model)
            {
                case WizardModel.SimpleModel:
                    if (Finish())
                    {
                        this.FinishBtnName = "完成";
                        m_isSucessFinsh = true;
                    }
                    break;
                case WizardModel.StepSettingModel:
                    if (Finish())//FinishAll
                    {
                        this.FinishBtnName = "完成";
                        m_isSucessFinsh = true;
                    }
                    break;
                case WizardModel.OneKeyModel:
                    if (Finish())
                    {
                        this.FinishBtnName = "完成";
                        m_isSucessFinsh = true;
                    }
                    break;
                default:
                    break;
            }
            this.Cursor = Cursors.Arrow;
        }
        private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (Model == WizardModel.OneKeyModel)
            {
                PluginArea.Children.Clear();
                int index = ((ListBox)sender).SelectedIndex;
                this.lblWizardCaption.Content = m_WizardSteps[index].Caption;
                this.txtDescription.Text = m_WizardSteps[index].Description;
                m_WizardSteps[index].Intializing();
                this.PluginArea.Children.Add((UIElement)m_WizardSteps[index]);
            }
        }
        private void btnExecute_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (ValidateAllSeteps())
                {
                    this.btnExecute.IsEnabled = false;
                    bool ExecuteResult = ExcuteAllSteps();
                    if (ExecuteResult)
                    {
                        this.btnExecute.IsEnabled = true;
                        m_view.MoveCurrentToFirst();
                        MessageHelper.ShowTips("执行成功!");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageHelper.ShowError(ex.Message);
            }
            this.btnExecute.IsEnabled = true;
        }
        private bool ValidateAllSeteps()
        {
            int setpCount = -1;
            bool validateResult = false;
            foreach (IWizardFramework wizard in m_WizardSteps)
            {
                ++setpCount;
                lstSetpCaption.SelectedIndex = setpCount;
                validateResult = wizard.Validating();
                //m_view.MoveCurrentToNext();
                if (!validateResult)
                {
                    //m_view.MoveCurrentToPrevious();
                    lstSetpCaption.SelectedIndex = setpCount;
                    return false;
                }
            }
            return validateResult;
        }
        private bool ExcuteAllSteps()
        {
            int setpCount = -1;
            bool validateReslut = false;
            foreach (IWizardFramework wizard in m_WizardSteps)
            {
                ++setpCount;
                lstSetpCaption.SelectedIndex = setpCount;
                validateReslut = wizard.Execute();
                //m_view.MoveCurrentToNext();
                if (!validateReslut)
                {
                    //m_view.MoveCurrentToPrevious();
                    lstSetpCaption.SelectedIndex = setpCount;
                    return false;
                }
            }
            return validateReslut;
        }
        private void btnSkip_Click(object sender, RoutedEventArgs e)
        {
            if (!IsValidate()) return;
            m_WizardSteps[m_currentSetp].Intializing(true);
            this.Cursor = Cursors.Wait;
            ++m_currentSetp;
            SetState();
            ButtonState();
            this.MoveNext(m_currentSetp);
            m_view.MoveCurrentToNext();
            this.Cursor = Cursors.Arrow;
        }
    }
    public class ProcesHelper
    {
        public static ProcesHelper Instance { get; } = new ProcesHelper();
        private ProcesHelper() { }
        public Action