using KGIS.Framework.DBOperator;
using KGIS.Framework.Maps;
using KGIS.Framework.Platform;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Dialog;
using KGIS.Framework.Utils.ExtensionMethod;
using KGIS.Framework.Utils.Helper;
using KGIS.Framework.Utils.Utility;
using Kingo.PluginServiceInterface;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows;
using System.Xml;
using UIShell.OSGi;
namespace Kingo.Plugin.MapView.Views.AppMenuView
{
    /// 
    /// 设置工作目录功能 的交互逻辑
    /// 
    public partial class UCSetWorkCatalog : BaseWindow
    {
        IWorkCatalog _workCatalog = null;
        List XZQCodeList = new List();
        //行政区代码集合
        List XZQCoderesult = new List();
        List _WorkCatalogPaths = new List();
        /// 
        /// 授权加密-区划代码
        /// 
        private static string getCodes = "";
        public UCSetWorkCatalog()
        {
            try
            {
                InitializeComponent();
                //行政区集合赋值
                Box_XZQCode.ItemsSource = GetXZQDic();
                _workCatalog = BundleRuntime.Instance.GetFirstOrDefaultService();
                if (_workCatalog != null && _workCatalog.SaveWorkSapcePath != null && !string.IsNullOrWhiteSpace(_workCatalog.SaveWorkSapcePath))
                {
                    string[] dirColl = Directory.GetDirectories(_workCatalog.SaveWorkSapcePath);
                    foreach (var dir in dirColl)
                    {
                        string folderName = Path.GetFileName(dir);
                        var XZQTemp = XZQCoderesult.FirstOrDefault(x => x.NAME == folderName.Split('(')[0]);
                        if (XZQTemp == null) continue;
                        string itemType = string.Format("{0}({1})", folderName.Split('(')[0], XZQTemp.CODE);//作为工作目录次级目录文件夹
                        if (XZQCodeList.FirstOrDefault(f => f.Descriction == itemType && f.ItemType == itemType) != null) continue;
                        XZQCodeList.Add(new XZQCodeData() { IsChecked = true, IsEnabled = false, Descriction = itemType, ItemType = itemType });
                    }
                    lbTBList.ItemsSource = null;
                    lbTBList.ItemsSource = XZQCodeList;
                }
                LoadXMLAttritue(_workCatalog.SaveWorkSapcePath, SysAppPath.GetRecentOpenProjectRecordConfigPath());
            }
            catch (Exception ex)
            {
                LogAPI.Debug("打开工作目录页面初始化时发生异常,异常信息如下:");
                LogAPI.Debug(ex);
            }
        }
        /// 
        /// 区划代码集(330110-余杭区)
        /// 
        /// 
        public List GetXZQDic()
        {
            IRDBHelper rdbHelper = null;
            try
            {
                string systemPath = SysAppPath.GetDataBasePath() + "System.mdb";
                if (File.Exists(systemPath))
                {
                    string connStr = SysConfigsOprator.GetDBConnectionByName("MDBOledbConnection");
                    connStr = string.Format(connStr, systemPath);
                    rdbHelper = RDBFactory.CreateDbHelper(connStr, DatabaseType.MSAccess);
                    string strSQL = "select OBJECTID AS ID, XZQ AS CODE,XZQMC AS NAME from XZQ Where XZQ LIKE '" + getCodes + "%'";
                    DataTable dt = rdbHelper.ExecuteDatatable("Dic", strSQL, true);
                    if (dt != null)
                    {
                        XZQCoderesult = TBToList.ToList(dt);
                        foreach (var item in XZQCoderesult)
                        {
                            item.DisplayName = item.CODE + "-" + item.NAME;
                            if (dt.Rows.Count == 1) Box_XZQCode.DisplayMemberPath = item.DisplayName;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug(ex);
            }
            finally
            {
                if (rdbHelper != null)
                    rdbHelper.DisConnect();
            }
            return XZQCoderesult;
        }
        /// 
        /// 行政区代码数据实体
        /// 
        public class XZQCodeData : INotifyPropertyChanged
        {
            private bool _IsChecked;
            public bool IsChecked
            {
                get { return _IsChecked; }
                set
                {
                    _IsChecked = value;
                    RaisePropertyChanged("IsChecked");
                }
            }
            public string ItemType { get; set; }
            public string Descriction { get; set; }
            public bool IsEnabled { get; set; }
            public event PropertyChangedEventHandler PropertyChanged;
            protected void RaisePropertyChanged(string propertyName)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        /// 
        /// 创建工作目录
        /// 
        /// 
        /// 
        private void btnExtract_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _workCatalog = BundleRuntime.Instance.GetFirstOrDefaultService();
                if (_workCatalog != null)
                {
                    if (!_workCatalog.IsOpenView) _workCatalog.Open();
                    if (string.IsNullOrEmpty(btnSetWorkPath.Text.ToString())) return;
                    //不存在该目录,则创建
                    if (!Directory.Exists(btnSetWorkPath.Text.ToString())) Directory.CreateDirectory(btnSetWorkPath.Text.ToString());
                    //设置工作目录模板
                    foreach (var xzqcode in XZQCodeList)
                    {
                        if (xzqcode.IsChecked)
                        {
                            DirectoryCopy(btnSetWorkPath.Text.ToString(), xzqcode.ItemType);
                        }
                    }
                    //同一当前目录-加载/添加目录不需要加载工程
                    if (_workCatalog.SaveWorkSapcePath == btnSetWorkPath.Text.ToString())
                        _workCatalog.IsLoadProject = false;
                    else
                        _workCatalog.IsLoadProject = true;
                    _workCatalog.SetWorksapce(btnSetWorkPath.Text.ToString());
                    this.Close();
                    ProjectInfo ProInfo = MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo;
                    if (ProInfo != null)
                    {
                        if (ProInfo.ProjType == EnumProjType.BHTBTQ && Platform.Instance.SystemType != SystemTypeEnum.BGFWCG
                            || ProInfo.ProjType != EnumProjType.BHTBTQ && Platform.Instance.SystemType == SystemTypeEnum.BGFWCG)
                        {
                            ClearData();
                            LogAPI.Debug("工程类型与当前软件类型不匹配,将会导致功能不可用,请正确打开工程类型!");
                            KGIS.Framework.Utils.Helper.MessageHelper.ShowError("当前工程类型与当前软件类型不匹配,将会导致一些功能不可正常使用,请重新正确打开工程类型!");
                            return;
                        }
                    }
                    if (ProInfo != null && ProInfo.ProjType == EnumProjType.BHTBTQ && Platform.Instance.SystemType == SystemTypeEnum.BGFWCG)
                    {
                        //添加作业区标注
                        PluginServiceInterface.Helper.MarkLabelLayerForZYQ.MarkLayer();
                        IUcZYQMagrHelper ucZYQMagrHelper = BundleRuntime.Instance.GetFirstOrDefaultService();
                        if (ucZYQMagrHelper != null)
                        {
                            ucZYQMagrHelper.UpdataData();
                        }
                        IUcMulitMapControlHelper ucMulitMapControlHelper = BundleRuntime.Instance.GetFirstOrDefaultService();
                        if (ucMulitMapControlHelper != null)
                        {
                            ucMulitMapControlHelper.ClearData();
                            ucMulitMapControlHelper.SetLayer();
                            ucMulitMapControlHelper.MarkLabelLayer();
                        }
                    }
                }
                else
                {
                    MessageHelper.Show("打开工作目录失败!");
                }
            }
            catch (Exception ex)
            {
                MessageHelper.Show("打开工作目录失败,请查看系统日志!");
                LogAPI.Debug("打开工作目录时发生异常,异常信息如下:");
                LogAPI.Debug(ex);
            }
        }
        private void ClearData()
        {
            MapsManager.Instance.MapService.getAxMapControl().ClearLayers();
            if (Platform.Instance.SystemType == SystemTypeEnum.BGFWCG)
            {
                IUcZYQMagrHelper ucZYQMagrHelper = BundleRuntime.Instance.GetFirstOrDefaultService();
                if (ucZYQMagrHelper != null)
                {
                    ucZYQMagrHelper.ClearData();
                }
                IUcMulitMapControlHelper ucMulitMapControlHelper = BundleRuntime.Instance.GetFirstOrDefaultService();
                if (ucMulitMapControlHelper != null)
                {
                    ucMulitMapControlHelper.ClearData();
                }
            }
        }
        /// 
        /// 取消
        /// 
        /// 
        /// 
        private void btnConfirm_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        /// 
        /// 选择工作目录
        /// 
        /// 
        /// 
        private void BtnSelectedWorkCatalog_Click(object sender, RoutedEventArgs e)
        {
            FolderBrowserDialog m_Dialog = new FolderBrowserDialog();
            System.Windows.Forms.DialogResult result = m_Dialog.ShowDialog();
            if (result == System.Windows.Forms.DialogResult.Cancel)
            {
                btnSetWorkPath.SelectedIndex = 0;
                return;
            }
            _WorkCatalogPaths.Add(new WorkCatalogPaths { WorkCatalogPath = m_Dialog.SelectedPath.Trim(), UpdateTime = DateTime.Now, CODE = m_Dialog.SelectedPath.Trim(), DisplayName = m_Dialog.SelectedPath.Trim() });
            btnSetWorkPath.ItemsSource = null;
            _WorkCatalogPaths = _WorkCatalogPaths.OrderByDescending(x => x.UpdateTime).ToList();
            //string currPath = _workCatalog.SaveWorkSapcePath;
            btnSetWorkPath.ItemsSource = _WorkCatalogPaths;
            btnSetWorkPath.SelectedItem = _WorkCatalogPaths[0];
        }
        /// 
        /// 工作目录文件夹复制
        /// 
        /// 存放工程文件名
        /// 被创建的目录
        public void DirectoryCopy(string targetDirPath, string xzqCode_Name)
        {
            try
            {
                string targetDir = targetDirPath + "\\" + xzqCode_Name;
                //创建工程目录文件
                if (!Directory.Exists(targetDir)) Directory.CreateDirectory(targetDir);
                if (NCSJ.IsChecked == true && !Directory.Exists(targetDir + "\\" + NCSJ.Content.ToString()))
                    Directory.CreateDirectory(targetDir + "\\" + NCSJ.Content.ToString());
                if (GCML.IsChecked == true && !Directory.Exists(targetDir + "\\" + GCML.Content.ToString()))
                    Directory.CreateDirectory(targetDir + "\\" + GCML.Content.ToString());
                if (CKSJ.IsChecked == true && !Directory.Exists(targetDir + "\\" + CKSJ.Content.ToString()))
                    Directory.CreateDirectory(targetDir + "\\" + CKSJ.Content.ToString());
                if (JZCG.IsChecked == true && !Directory.Exists(targetDir + "\\" + JZCG.Content.ToString()))
                    Directory.CreateDirectory(targetDir + "\\" + JZCG.Content.ToString());
            }
            catch (Exception ex)
            {
                LogAPI.Debug("创建工程目录页面中,文件夹复制时失败,异常原因: " + ex.Message + " ; ");
                throw;
            }
        }
        /// 
        /// 添加行政区
        /// 
        /// 
        /// 
        private void AddXZQCode_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(Box_XZQCode.SelectedValue.ToTrim())) return;
                SelectXZQCodeData.ItemsSource = null;
                string dispalyName = XZQCoderesult.FirstOrDefault(x => x.CODE == Box_XZQCode.SelectedValue.ToTrim()).NAME;
                string itemType = string.Format("{0}({1})", dispalyName, Box_XZQCode.SelectedValue.ToTrim());//作为工作目录次级目录文件夹
                XZQCodeList.Add(new XZQCodeData() { IsChecked = true, Descriction = itemType, ItemType = itemType });
                lbTBList.ItemsSource = null;
                lbTBList.ItemsSource = XZQCodeList;
                //SelectXZQCodeData.ItemsSource = XZQCodeList;
            }
            catch (Exception ex)
            {
                LogAPI.Debug("添加行政区发生错误:" + ex.Message);
                throw;
            }
        }
        /// 
        /// 加载工作目录集合
        /// 
        /// 
        /// 
        private void LoadXMLAttritue(string workcatalog, string sXmlPath)
        {
            XmlDocument doc = new XmlDocument();
            XmlElement orderElement = null;
            XmlNodeList orderChildr = null;
            try
            {
                //if (string.IsNullOrWhiteSpace(workcatalog) == true || string.IsNullOrWhiteSpace(workcatalog) == true) return;
                if (File.Exists(sXmlPath) == false) return;
                doc.Load(sXmlPath);
                orderElement = doc.DocumentElement;// 获取根节点
                if (orderElement == null) return;
                if (orderElement.ChildNodes == null || orderElement.ChildNodes.Count <= 0) return;
                orderChildr = orderElement.ChildNodes;
                if (orderChildr == null || orderChildr.Count <= 0) return;
                _WorkCatalogPaths = new List();
                foreach (XmlNode item in orderChildr)
                {
                    string path = item.Attributes["ProjectPath"].Value;
                    if (string.IsNullOrWhiteSpace(path) || !Directory.Exists(path)) continue;
                    _WorkCatalogPaths.Add(new WorkCatalogPaths { WorkCatalogPath = item.Attributes["ProjectPath"].Value, UpdateTime = Convert.ToDateTime(item.Attributes["LastOpenTime"].Value), CODE = item.Attributes["ProjectPath"].Value, DisplayName = item.Attributes["ProjectPath"].Value });
                }
                if (_WorkCatalogPaths.Count > 0)
                {
                    _WorkCatalogPaths = _WorkCatalogPaths.OrderByDescending(x => x.UpdateTime).ToList();
                    //string currPath = _workCatalog.SaveWorkSapcePath;
                    btnSetWorkPath.ItemsSource = _WorkCatalogPaths;
                    btnSetWorkPath.SelectedItem = _WorkCatalogPaths[0];
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug(ex.Message);
                return;
            }
            finally
            {
                if (doc != null) doc = null;
                if (orderElement != null) orderElement = null;
                if (orderChildr != null && orderChildr.Count > 0) orderChildr = null;
                if (string.IsNullOrWhiteSpace(sXmlPath) == false) sXmlPath = "";
            }
        }
        /// 
        /// 自动筛选实体类
        /// 
        public class WorkCatalogPaths
        {
            public override string ToString() { return WorkCatalogPath; }
            /// 
            /// 工作目录路径
            /// 
            public string WorkCatalogPath { get; set; }
            public string CODE { get; set; }
            public string DisplayName { get; set; }
            public DateTime UpdateTime { get; set; }
        }
        private void btnSetWorkPath_SelectedIndexChanged(object sender, RoutedEventArgs e)
        {
            var item = btnSetWorkPath.SelectedItem;
            if (item is WorkCatalogPaths)
            {
                string[] dirColl = Directory.GetDirectories((item as WorkCatalogPaths).WorkCatalogPath);
                XZQCodeList.Clear();
                foreach (var dir in dirColl)
                {
                    string folderName = Path.GetFileName(dir);
                    var XZQTemp = XZQCoderesult.FirstOrDefault(x => x.NAME == folderName.Split('(')[0] && x.CODE == folderName.Split('(')[1].TrimEnd(')'));
                    if (XZQTemp == null) continue;
                    string itemType = string.Format("{0}({1})", folderName.Split('(')[0], XZQTemp.CODE);//作为工作目录次级目录文件夹
                    if (XZQCodeList.FirstOrDefault(f => f.Descriction == itemType && f.ItemType == itemType) != null) continue;
                    XZQCodeList.Add(new XZQCodeData() { IsChecked = true, IsEnabled = false, Descriction = itemType, ItemType = itemType });
                }
                lbTBList.ItemsSource = null;
                lbTBList.ItemsSource = XZQCodeList;
            }
        }
    }
}