using DevExpress.Spreadsheet;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.Maps;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.ExtensionMethod;
using KGIS.Framework.Utils.Helper;
using Kingo.PluginServiceInterface.Model;
using KUI.Windows;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Input;
using System.Xml.Linq;
namespace Kingo.Plugin.BGSetting.View
{
    /// 
    /// FrmKCDLXSWH.xaml 的交互逻辑
    /// 
    public partial class FrmKCDLXSWH : BaseWindow
    {
        private List GDEntitys;
        private XDocument xDoc;
        private PluginServiceInterface.ProjectInfo projectInfo;
        private string BG_GDLXConfigPath;
        IFeatureCursor pTT1FeatureCursor;
        IFeature pTT1Feature;
        IQueryFilter pQueryFilterTT1 = new QueryFilter();
        string GDLX = null;
        string GDPDJB = null;
        object obj = null;
        public FrmKCDLXSWH()
        {
            InitializeComponent();
            projectInfo = MapsManager.Instance.CurrProjectInfo as PluginServiceInterface.ProjectInfo;
            BG_GDLXConfigPath = projectInfo.ProjDir + "\\BG_GDLXConfig.xml";
            if (string.IsNullOrWhiteSpace(BG_GDLXConfigPath) || !File.Exists(BG_GDLXConfigPath))
                BG_GDLXConfigPath = SysAppPath.GetBGGDLXConfigPath();
            InitGD();
        }
        public void InitGD()
        {
            try
            {
                GDEntitys = new List();
                xDoc = XDocument.Load(BG_GDLXConfigPath);
                foreach (XElement xElement in xDoc.Descendants("Item"))
                {
                    GDEntity model = new GDEntity();
                    model.GDLX = xElement.Attributes("GDLX").Single().Value;
                    model.GDPDJB = xElement.Attributes("GDPDJB").Single().Value;
                    model.GDPDJBMC = xElement.Attributes("GDPDJBMC").Single().Value;
                    decimal kcdlxs = 0;
                    if (decimal.TryParse(xElement.Attributes("KCDLXS").Single().Value, out kcdlxs))
                    {
                        model.KCDLXS = kcdlxs;
                    }
                    else
                    {
                        model.KCDLXS = 0;
                    }
                    GDEntitys.Add(model);
                }
                this.dgData.ItemsSource = GDEntitys;
            }
            catch (Exception ex)
            {
                MessageHelper.ShowTips("界面初始化失败,可能的原因是:" + ex.Message);
            }
        }
        /// 
        /// 导入扣除系数
        /// 
        /// 
        /// 
        private void btnImport_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                string excelfilePath = string.Empty;
                KGIS.Framework.Utils.Dialog.OpenFileDialog openFileDialog = new KGIS.Framework.Utils.Dialog.OpenFileDialog();
                openFileDialog.Title = "导入扣除系数表EXCEL";
                openFileDialog.Filter = "Excel Files(*.xlsx)| *.xlsx";
                openFileDialog.FileName = string.Empty;
                openFileDialog.FilterIndex = 1;
                if (openFileDialog.ShowDialog())
                {
                    excelfilePath = openFileDialog.FileName;
                    if (FileIsUsed(excelfilePath))
                    {
                        MessageHelper.ShowWarning("文件被占用,请关闭占用文件的相关程序,或者选择其他文件!");
                        return;
                    }
                    if (MessageHelper.ShowYesNoAndTips("确定要导入吗?导入将覆盖现有的扣除系数!") == System.Windows.Forms.DialogResult.Yes)
                    {
                        Workbook workbook = new Workbook();
                        using (FileStream stream = new FileStream(excelfilePath, FileMode.Open))
                        {
                            workbook.LoadDocument(stream, DocumentFormat.OpenXml);
                            var worksheet = workbook.Worksheets[0];
                            bool exitload = false;
                            var rowindex = 0;
                            Dictionary kcxsDic = new Dictionary();
                            while (!exitload)
                            {
                                if (string.IsNullOrWhiteSpace(worksheet.Rows[rowindex][0].DisplayText))
                                {
                                    if (rowindex < 5)
                                    {
                                        rowindex++;
                                        continue;
                                    }
                                    exitload = true;
                                    break;
                                }
                                if (rowindex == 0)
                                {
                                    if (worksheet.Rows[rowindex][2].DisplayText != "耕地坡度级别" || worksheet.Rows[rowindex][3].DisplayText != "梯田田坎系数" || worksheet.Rows[rowindex][4].DisplayText != "坡地田坎系数")
                                    {
                                        MessageHelper.ShowError("文件解析错误,请选择正确的田坎系数表!");
                                        exitload = true;
                                        break;
                                    }
                                }
                                if (rowindex > 0)
                                {
                                    string pdjb = worksheet.Rows[rowindex][2].Value.ToString();
                                    string ttkcxs = worksheet.Rows[rowindex][3].Value.ToString();
                                    string pdkcxs = worksheet.Rows[rowindex][4].Value.ToString();
                                    if (!string.IsNullOrWhiteSpace(pdjb) && !string.IsNullOrWhiteSpace(ttkcxs) && (string.IsNullOrWhiteSpace(pdkcxs) || pdkcxs == "0"))
                                    {
                                        if (!kcxsDic.ContainsKey("TT-" + pdjb))
                                            kcxsDic.Add("TT-" + pdjb, ttkcxs.ToDecimal());
                                    }
                                    else if (!string.IsNullOrWhiteSpace(pdjb) && !string.IsNullOrWhiteSpace(pdkcxs) && (string.IsNullOrWhiteSpace(ttkcxs) || ttkcxs == "0"))
                                    {
                                        if (!kcxsDic.ContainsKey("PD-" + pdjb))
                                            kcxsDic.Add("PD-" + pdjb, pdkcxs.ToDecimal());
                                    }
                                }
                                rowindex++;
                            }
                            if (kcxsDic.Count != 0)
                            {
                                List Entitys = this.dgData.ItemsSource as List;
                                if (Entitys != null && Entitys.Count > 0)
                                {
                                    foreach (GDEntity model in Entitys)
                                    {
                                        string key = string.Format("{0}-{1}", model.GDLX, model.GDPDJB);
                                        if (this.cbIgnore.IsChecked == true && model.KCDLXS != 0) continue;
                                        if (kcxsDic.ContainsKey(key))
                                            model.KCDLXS = kcxsDic[key];
                                        else
                                            model.KCDLXS = 0;
                                    }
                                }
                                this.dgData.RefreshData();
                                MessageHelper.Show("扣除系数导入成功!");
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug("扣除地类系数导入失败:" + ex.Message);
                MessageHelper.ShowError("扣除地类系数导入失败:" + ex.Message);
            }
        }
        /// 
        /// 返回指示文件是否已被其它程序使用的布尔值
        /// 
        /// 文件的完全限定名,例如:“C:\MyFile.txt”。
        /// 如果文件已被其它程序使用,则为 true;否则为 false。
        public Boolean FileIsUsed(string fileFullName)
        {
            Boolean result = false;
            //判断文件是否存在,如果不存在,直接返回 false
            if (!System.IO.File.Exists(fileFullName))
            {
                result = false;
            }
            else
            {
                //如果文件存在,则继续判断文件是否已被其它程序使用
                //逻辑:尝试执行打开文件的操作,如果文件已经被其它程序使用,则打开失败,抛出异常,根据此类异常可以判断文件是否已被其它程序使用。
                FileStream fileStream = null;
                try
                {
                    fileStream = File.Open(fileFullName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
                    result = false;
                }
                catch (IOException)
                {
                    result = true;
                }
                catch (Exception)
                {
                    result = true;
                }
                finally
                {
                    fileStream?.Close();
                }
            }
            return result;
        }
        /// 
        /// 保存配置
        /// 
        /// 
        /// 
        private void btnApple_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                List Entitys = GDEntitys.ToList();
                if (Entitys != null && Entitys.Count > 0)
                {
                    foreach (GDEntity model in Entitys)
                    {
                        xDoc.Descendants("Item").Where(p => p.Attribute("GDLX").Value.Equals(model.GDLX) && p.Attribute("GDPDJB").Value.Equals(model.GDPDJB)).Single().Attribute("KCDLXS").SetValue(model.KCDLXS.ToString());
                    }
                    xDoc.Save(BG_GDLXConfigPath);
                    if (e != null)
                    {
                        MessageHelper.ShowTips("保存成功!");
                        this.Close();
                    }
                }
                else
                {
                    MessageHelper.ShowTips("请选择要应用的耕地类型!");
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug("赋值失败,可能的原因是:" + ex.Message);
                MessageHelper.ShowError("赋值失败,可能的原因是:" + ex.Message);
            }
        }
        private void Save()
        {
            List Entitys = GDEntitys.ToList();
            foreach (GDEntity model1 in Entitys)
            {
                if (model1.GDLX == GDLX && model1.GDPDJB == GDPDJB)
                {
                    if (this.cbIgnore.IsChecked == true && model1.KCDLXS != 0) continue;
                    xDoc.Descendants("Item").Where(p => p.Attribute("GDLX").Value.Equals(model1.GDLX) && p.Attribute("GDPDJB").Value.Equals(model1.GDPDJB)).Single().Attribute("KCDLXS").SetValue(obj.ToString());
                }
            }
            string strPath = (MapsManager.Instance.CurrProjectInfo as PluginServiceInterface.ProjectInfo).ProjDir + "\\BG_GDLXConfig.xml";//获取配置文件路径
            if (string.IsNullOrWhiteSpace(strPath) || !File.Exists(strPath))
                strPath = SysAppPath.GetBGGDLXConfigPath();
            xDoc.Save(strPath);
        }
        private void ClearData()
        {
            obj = "";
            List Entitys = GDEntitys.ToList();
            foreach (GDEntity model1 in Entitys)
            {
                if (this.cbIgnore.IsChecked == true && model1.KCDLXS != 0) continue;
                xDoc.Descendants("Item").Where(p => p.Attribute("GDLX").Value.Equals(model1.GDLX) && p.Attribute("GDPDJB").Value.Equals(model1.GDPDJB)).Single().Attribute("KCDLXS").SetValue(obj.ToString());
            }
            string strPath = (MapsManager.Instance.CurrProjectInfo as PluginServiceInterface.ProjectInfo).ProjDir + "\\BG_GDLXConfig.xml";//获取配置文件路径
            if (string.IsNullOrWhiteSpace(strPath) || !File.Exists(strPath))
                strPath = SysAppPath.GetBGGDLXConfigPath();
            xDoc.Save(strPath);
        }
        /// 
        /// 提取扣除地类系数
        /// 
        /// 
        /// 
        private void btnExtract_Click(object sender, RoutedEventArgs e)
        {
            //忽略已填写的,则不清除数据
            if (this.cbIgnore.IsChecked == false) ClearData();
            //保存已输入的数据
            if (this.cbIgnore.IsChecked == true) btnApple_Click(sender, null);
            try
            {
                DialogResult result = MessageHelper.ShowYesNoAndTips("是否根据基础库中数据提取相应的扣除地类系数?");
                if (result == System.Windows.Forms.DialogResult.Yes)
                {
                    //提取数据
                    IFeatureLayer JC_layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑");
                    if (JC_layer == null || JC_layer.FeatureClass == null) return;
                    IFeatureClass pFeatureClass = JC_layer.FeatureClass as IFeatureClass;
                    ITable pTable = pFeatureClass as ITable;
                    this.ShowLoading("正在提取数据……", 0, 0);
                    #region 梯田扣除地类系数
                    string TempFH = "%";
                    if (Path.GetExtension((pFeatureClass as FeatureClass).Workspace.PathName).ToLower().Contains(".mdb"))
                        TempFH = "*";
                    for (int i = 0; i < pTable.Fields.FieldCount; i++)
                    {
                        IField pField = pFeatureClass.Fields.get_Field(i);
                        if (pField.AliasName == "扣除地类系数" || pField.AliasName == "KCXS")
                        {
                            for (int j = 1; j < 6; j++)
                            {
                                if (j == 1)
                                {
                                    pQueryFilterTT1.WhereClause = string.Format(" KCXS >= 0 AND GDLX = 'TT' AND DLBM LIKE '01{1}' AND GDPDJB = '{0}' ", j, TempFH);
                                    pTT1FeatureCursor = pFeatureClass.Search(pQueryFilterTT1, true);
                                    pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    while (pTT1Feature != null)
                                    {
                                        obj = pTT1Feature.get_Value(i);
                                        GDLX = "TT";
                                        GDPDJB = "1";
                                        Save();
                                        if (!string.IsNullOrWhiteSpace(obj?.ToString() ?? ""))
                                            break;
                                        else
                                            pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    }
                                }
                                else if (j == 2)
                                {
                                    pQueryFilterTT1.WhereClause = string.Format(" KCXS >= 0 AND GDLX = 'TT' AND  DLBM LIKE '01{1}' AND GDPDJB = '{0}' ", j, TempFH);
                                    pTT1FeatureCursor = pFeatureClass.Search(pQueryFilterTT1, true);
                                    pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    while (pTT1Feature != null)
                                    {
                                        obj = pTT1Feature.get_Value(i);
                                        GDLX = "TT";
                                        GDPDJB = "2";
                                        Save();
                                        if (!string.IsNullOrWhiteSpace(obj?.ToString() ?? ""))
                                            break;
                                        else
                                            pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    }
                                }
                                else if (j == 3)
                                {
                                    pQueryFilterTT1.WhereClause = string.Format(" KCXS >= 0 AND GDLX = 'TT' AND  DLBM LIKE '01{1}' AND GDPDJB = '{0}' ", j, TempFH);
                                    pTT1FeatureCursor = pFeatureClass.Search(pQueryFilterTT1, true);
                                    pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    while (pTT1Feature != null)
                                    {
                                        obj = pTT1Feature.get_Value(i);
                                        GDLX = "TT";
                                        GDPDJB = "3";
                                        Save();
                                        if (!string.IsNullOrWhiteSpace(obj?.ToString() ?? ""))
                                            break;
                                        else
                                            pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    }
                                }
                                else if (j == 4)
                                {
                                    pQueryFilterTT1.WhereClause = string.Format(" KCXS >= 0 AND GDLX = 'TT' AND  DLBM LIKE '01{1}' AND GDPDJB = '{0}' ", j, TempFH);
                                    pTT1FeatureCursor = pFeatureClass.Search(pQueryFilterTT1, true);
                                    pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    while (pTT1Feature != null)
                                    {
                                        obj = pTT1Feature.get_Value(i);
                                        GDLX = "TT";
                                        GDPDJB = "4";
                                        Save();
                                        if (!string.IsNullOrWhiteSpace(obj?.ToString() ?? ""))
                                            break;
                                        else
                                            pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    }
                                }
                                else if (j == 5)
                                {
                                    pQueryFilterTT1.WhereClause = string.Format(" KCXS >= 0 AND GDLX = 'TT' AND  DLBM LIKE '01{1}' AND GDPDJB = '{0}' ", j, TempFH);
                                    pTT1FeatureCursor = pFeatureClass.Search(pQueryFilterTT1, true);
                                    pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    while (pTT1Feature != null)
                                    {
                                        obj = pTT1Feature.get_Value(i);
                                        GDLX = "TT";
                                        GDPDJB = "5";
                                        Save();
                                        if (!string.IsNullOrWhiteSpace(obj?.ToString() ?? ""))
                                            break;
                                        else
                                            pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    }
                                }
                            }
                            break;
                        }
                    }
                    #endregion
                    #region 坡地扣除地类系数
                    for (int k = 0; k < pTable.Fields.FieldCount; k++)
                    {
                        IField pField = pFeatureClass.Fields.get_Field(k);
                        if (pField.AliasName == "扣除地类系数" || pField.AliasName == "KCXS")
                        {
                            for (int j = 1; j < 6; j++)
                            {
                                if (j == 1)
                                {
                                    pQueryFilterTT1.WhereClause = string.Format(" KCXS >= 0 AND GDLX = 'TT' AND  DLBM LIKE '01{1}' AND GDPDJB = '{0}' ", j, TempFH);
                                    pTT1FeatureCursor = pFeatureClass.Search(pQueryFilterTT1, true);
                                    pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    while (pTT1Feature != null)
                                    {
                                        obj = pTT1Feature.get_Value(k);
                                        GDLX = "PD";
                                        GDPDJB = "1";
                                        Save();
                                        if (!string.IsNullOrWhiteSpace(obj?.ToString() ?? ""))
                                            break;
                                        else
                                            pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    }
                                }
                                else if (j == 2)
                                {
                                    pQueryFilterTT1.WhereClause = string.Format(" KCXS >= 0 AND GDLX = 'PD' AND  DLBM LIKE '01{1}' AND GDPDJB = '{0}' ", j, TempFH);
                                    pTT1FeatureCursor = pFeatureClass.Search(pQueryFilterTT1, true);
                                    pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    while (pTT1Feature != null)
                                    {
                                        obj = pTT1Feature.get_Value(k);
                                        GDLX = "PD";
                                        GDPDJB = "2";
                                        Save();
                                        if (!string.IsNullOrWhiteSpace(obj?.ToString() ?? ""))
                                            break;
                                        else
                                            pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    }
                                }
                                else if (j == 3)
                                {
                                    pQueryFilterTT1.WhereClause = string.Format(" KCXS >= 0 AND GDLX = 'PD' AND  DLBM LIKE '01{1}' AND GDPDJB = '{0}' ", j, TempFH);
                                    pTT1FeatureCursor = pFeatureClass.Search(pQueryFilterTT1, true);
                                    pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    while (pTT1Feature != null)
                                    {
                                        obj = pTT1Feature.get_Value(k);
                                        GDLX = "PD";
                                        GDPDJB = "3";
                                        Save();
                                        if (!string.IsNullOrWhiteSpace(obj?.ToString() ?? ""))
                                            break;
                                        else
                                            pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    }
                                }
                                else if (j == 4)
                                {
                                    pQueryFilterTT1.WhereClause = string.Format(" KCXS >= 0 AND GDLX = 'PD' AND  DLBM LIKE '01{1}' AND GDPDJB = '{0}' ", j, TempFH);
                                    pTT1FeatureCursor = pFeatureClass.Search(pQueryFilterTT1, true);
                                    pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    while (pTT1Feature != null)
                                    {
                                        obj = pTT1Feature.get_Value(k);
                                        GDLX = "PD";
                                        GDPDJB = "4";
                                        Save();
                                        if (!string.IsNullOrWhiteSpace(obj?.ToString() ?? ""))
                                            break;
                                        else
                                            pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    }
                                }
                                else if (j == 5)
                                {
                                    pQueryFilterTT1.WhereClause = string.Format(" KCXS >= 0 AND GDLX = 'PD' AND  DLBM LIKE '01{1}' AND GDPDJB = '{0}' ", j, TempFH);
                                    pTT1FeatureCursor = pFeatureClass.Search(pQueryFilterTT1, true);
                                    pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    while (pTT1Feature != null)
                                    {
                                        obj = pTT1Feature.get_Value(k);
                                        GDLX = "PD";
                                        GDPDJB = "5";
                                        Save();
                                        if (!string.IsNullOrWhiteSpace(obj?.ToString() ?? ""))
                                            break;
                                        else
                                            pTT1Feature = pTT1FeatureCursor.NextFeature();
                                    }
                                }
                            }
                            break;
                        }
                    }
                    #endregion
                }
                else
                {
                    return;
                }
                this.dgData.ItemsSource = null;
                InitGD();
                this.dgData.ItemsSource = GDEntitys;
                btnApple_Click(sender, null);
                this.CloseLoading();
                MessageHelper.ShowTips("提取成功!");
            }
            catch (Exception ex)
            {
                this.CloseLoading();
                MessageHelper.ShowError("提取失败!");
                LogAPI.Debug(ex);
            }
            finally
            {
                this.CloseLoading();
            }
        }
        /// 
        /// 确定逻辑
        /// 
        /// 
        /// 
        private void btnConfirm_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        /// 
        /// 双击模板下载
        /// 
        /// 
        /// 
        private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try
            {
                string savepaths = string.Empty;
                SaveFileDialog dialog = new SaveFileDialog();
                dialog.DefaultExt = "xlsx";
                dialog.Filter = "Excel Files(*.xlsx)|*.xlsx";
                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    savepaths = dialog.FileName;
                else
                    return;
                if (string.IsNullOrWhiteSpace(savepaths))
                {
                    MessageHelper.Show("未获取到文件路径!");
                    return;
                }
                if (File.Exists(savepaths))
                {
                    var result = MessageHelper.ShowYesNoAndTips("文件已存在,是否覆盖?");
                    if (result == System.Windows.Forms.DialogResult.No) return;
                }
                string strPath = AppDomain.CurrentDomain.BaseDirectory + @"工作空间\模板\字典模板\田坎系数表模板.xlsx";
                File.Copy(strPath, savepaths, true);
                MessageHelper.Show("模板下载已完成!");
            }
            catch (Exception ex)
            {
                LogAPI.Debug("下载失败信息:" + ex.Message);
                MessageHelper.ShowError("田坎系数表模板下载失败!");
            }
        }
    }
}