using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using KGIS.Framework.AE;
using KGIS.Framework.AE.Enum;
using KGIS.Framework.Commands;
using KGIS.Framework.Maps;
using KGIS.Framework.Platform;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using Kingo.Framework.LayerStyleConvert.Common;
using Kingo.Framework.LayerStyleConvert.XSDClass;
using Kingo.PluginServiceInterface;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UIShell.OSGi;
namespace Kingo.Plugin.BGSetting.Commands
{
    /// 
    /// 系统设置-功能点
    /// 
    public class CmdCreateZLDB : BaseMenuCommand
    {
        private IDataCatalogService _DataCatalog = null;
        /// 
        /// 编辑器
        /// 
        private EngineEditorClass pEditor = null;
        private IHookHelper hookHelper = null;
        private SystemConfig2 SystemCfg = null;
        public override void OnClick()
        {
            IWorkspaceAPI wsAPI = null;
            try
            {
                if (_DataCatalog == null)
                    _DataCatalog = BundleRuntime.Instance.GetFirstOrDefaultService();
                if (_DataCatalog == null)
                    return;
                if (!(MapsManager.Instance.MapService.GetProjectInfo() is ProjectInfo ProInfo))
                {
                    return;
                }
                if (pEditor == null)
                    pEditor = new EngineEditorClass();
                if (pEditor.EditState != esriEngineEditState.esriEngineStateNotEditing)
                {
                    MessageHelper.ShowTips("请先关闭编辑!");
                    return;
                }
                PluginServiceInterface.CommonHelper.DirectoryCopy(SysAppPath.GetCurrentAppPath() + string.Format("工作空间\\模板\\新建变更工程\\{0}\\ZLDB.gdb", (int)Math.Floor(Math.Round(10 / ProInfo.XYResolution))), ProInfo.ProjDir);
                PluginServiceInterface.CommonHelper.DirectoryCopy(SysAppPath.GetCurrentAppPath() + string.Format("工作空间\\模板\\新建变更工程\\{0}\\NMDB.gdb", (int)Math.Floor(Math.Round(10 / ProInfo.XYResolution))), ProInfo.ProjDir);
                ProInfo.ZLDatabase = Path.Combine(ProInfo.ProjDir, "ZLDB.gdb");
                ProInfo.NMDatabase = Path.Combine(ProInfo.ProjDir, "NMDB.gdb");
                //ProInfo.Save();
                ISystemCfg cfg2 = BundleRuntime.Instance.GetFirstOrDefaultService();
                SystemCfg = cfg2.Load();
                if (SystemCfg.ZLLayerLoadCfg == null)
                {
                    SystemCfg.ZLLayerLoadCfg = new List();
                }
                #region 增量数据库创建
                wsAPI = new WorkspaceAPI(ProInfo.ZLDatabase, KGIS.Framework.AE.Enum.WorkspaceTypeEnum.GDBFile, true);
                GeoDBAPI.SetGeoDatasetSpatialReference(wsAPI.CurrentWorkspace, hookHelper.FocusMap.SpatialReference, ProInfo.XYResolution);
                IGroupLayer rootGroupLayer = new GroupLayer() { Name = "增量成果" };
                ILayerGeneralProperties zlcglp = rootGroupLayer as ILayerGeneralProperties;
                zlcglp.LayerDescription = "ZLCG";
                LayerCfg GroupLayerInfo = _DataCatalog.AddLayer(rootGroupLayer) as LayerCfg;
                #region 添加单独图层
                IFeatureClassAPI PDTGXFcAPI = wsAPI.OpenFeatureClass("PDTGX");
                IFeatureLayer tempLayer = new FeatureLayer() { Name = "坡度图更新", FeatureClass = PDTGXFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "PDTGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI CCWJQGXFcAPI = wsAPI.OpenFeatureClass("CCWJQGX");
                tempLayer = new FeatureLayer() { Name = "拆除未尽区更新", FeatureClass = CCWJQGXFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "CCWJQGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI GDDBGXFcAPI = wsAPI.OpenFeatureClass("GDDBGX");
                tempLayer = new FeatureLayer() { Name = "耕地等别更新层", FeatureClass = GDDBGXFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "GDDBGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI GFBQGXFcAPI = wsAPI.OpenFeatureClass("GFBQGX");
                tempLayer = new FeatureLayer() { Name = "光伏板区更新层", FeatureClass = GFBQGXFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "GFBQGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                //23年规则起,不在包含“临时用地”单独图层
                //IFeatureClassAPI LSYDGXFcAPI = wsAPI.OpenFeatureClass("LSYDGX");
                //tempLayer = new FeatureLayer() { Name = "临时用地更新层", FeatureClass = LSYDGXFcAPI.FeatureClass };
                //SetILayerSymbol(tempLayer, "LSYDGX");
                //_DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                //23年新增“工厂化工种植更新”
                if (wsAPI.ExistFeatureClass("GCHZZGX"))
                {
                    IFeatureClassAPI GCHZZGXFcAPI = wsAPI.OpenFeatureClass("GCHZZGX");
                    tempLayer = new FeatureLayer() { Name = "工厂化种植更新", FeatureClass = GCHZZGXFcAPI.FeatureClass };
                    SetILayerSymbol(tempLayer, "GCHZZGX");
                    _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                }
                IFeatureClassAPI LMFWGXFcAPI = wsAPI.OpenFeatureClass("LMFWGX");
                tempLayer = new FeatureLayer() { Name = "路面范围更新层", FeatureClass = LMFWGXFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "LMFWGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI TTQGXFcAPI = wsAPI.OpenFeatureClass("TTQGX");
                tempLayer = new FeatureLayer() { Name = "推土区更新层", FeatureClass = TTQGXFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "TTQGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI MPFcAPI = wsAPI.OpenFeatureClass("MP");
                tempLayer = new FeatureLayer() { Name = "摸排", FeatureClass = MPFcAPI.FeatureClass };
                //SetILayerSymbol(tempLayer, "MP");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI YNRGDQCZFWFcAPI = wsAPI.OpenFeatureClass("YNRGDQCZFW");
                tempLayer = new FeatureLayer() { Name = "已纳入过渡期处置范围", FeatureClass = YNRGDQCZFWFcAPI.FeatureClass };
                //SetILayerSymbol(tempLayer, "YNRGDQCZFW");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                #endregion
                //hookHelper.FocusMap.AddLayer(rootGroupLayer);
                IGroupLayer groupLayer = new GroupLayer() { Name = "增量图层" };
                ILayerGeneralProperties zltclp = groupLayer as ILayerGeneralProperties;
                zltclp.LayerDescription = "ZLTC";
                GroupLayerInfo = _DataCatalog.AddLayer(groupLayer, GroupLayerInfo) as LayerCfg;
                //rootGroupLayer.Add(groupLayer);
                IFeatureClassAPI xzqgcFcAPI = wsAPI.OpenFeatureClass("XZQGXGC");
                tempLayer = new FeatureLayer() { Name = "行政区更新过程", FeatureClass = xzqgcFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "XZQGXGC");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI xzqjxgxFcAPI = wsAPI.OpenFeatureClass("XZQJXGX");
                tempLayer = new FeatureLayer() { Name = "行政区界线更新", FeatureClass = xzqjxgxFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "XZQJXGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI xzqgxFcAPI = wsAPI.OpenFeatureClass("XZQGX");
                tempLayer = new FeatureLayer() { Name = "行政区更新", FeatureClass = xzqgxFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "XZQGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI cjdcqgcFcAPI = wsAPI.OpenFeatureClass("CJDCQGXGC");
                tempLayer = new FeatureLayer() { Name = "村级调查区更新过程", FeatureClass = cjdcqgcFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "CJDCQGXGC");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI cjdcqjxgxFcAPI = wsAPI.OpenFeatureClass("CJDCQJXGX");
                tempLayer = new FeatureLayer() { Name = "村级调查区界线更新", FeatureClass = cjdcqjxgxFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "CJDCQJXGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI cjdcqgxFcAPI = wsAPI.OpenFeatureClass("CJDCQGX");
                tempLayer = new FeatureLayer() { Name = "村级调查区更新", FeatureClass = cjdcqgxFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "CJDCQGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI czcgcFcAPI = wsAPI.OpenFeatureClass("CZCDYDGXGC");
                tempLayer = new FeatureLayer() { Name = "城镇村更新过程", FeatureClass = czcgcFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "CZCDYDGXGC");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI czcgxFcAPI = wsAPI.OpenFeatureClass("CZCDYDGX");
                tempLayer = new FeatureLayer() { Name = "城镇村更新", FeatureClass = czcgxFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "CZCDYDGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI bgtbFcAPI = wsAPI.OpenFeatureClass("DLTBGXGC");
                AddFieldSXWHForDBLayer.JudgeTypeAddField(ProInfo, bgtbFcAPI.FeatureClass);
                tempLayer = new FeatureLayer() { Name = "地类图斑更新过程", FeatureClass = bgtbFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "DLTBGXGC");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                IFeatureClassAPI jctbFcAPI = wsAPI.OpenFeatureClass("DLTBGX");
                AddFieldSXWHForDBLayer.JudgeTypeAddField(ProInfo, jctbFcAPI.FeatureClass);
                tempLayer = new FeatureLayer() { Name = "地类图斑更新", FeatureClass = jctbFcAPI.FeatureClass };
                SetILayerSymbol(tempLayer, "DLTBGX");
                _DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
                #endregion
                ILayer groupLayerNM = MapsManager.Instance.MapService.GetGroupLayer("NMSJ");
                object GroupLayerInfoNM = _DataCatalog.GetNodeByLayer(groupLayerNM);
                IWorkspaceAPI NmWsAPI = new WorkspaceAPI(ProInfo.NMDatabase, WorkspaceTypeEnum.GDBFile, true);
                GeoDBAPI.SetGeoDatasetSpatialReference(NmWsAPI.CurrentWorkspace, hookHelper.FocusMap.SpatialReference, ProInfo.XYResolution);
                IFeatureLayer JCdltb_Layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑");
                IFeatureClassAPI DLTBNMKAPI = null;// NmWsAPI.CreateFeatureClass("DLTB_NMK", (JCdltb_Layer.FeatureClass as IGeoDataset).SpatialReference, JCdltb_Layer.FeatureClass.Fields);
                DLTBNMKAPI = NmWsAPI.OpenFeatureClass2("DLTB_NMK");
                if (DLTBNMKAPI != null)
                {
                    if (DLTBNMKAPI.FeatureClass.FindField("XZQDM") == -1)
                        DLTBNMKAPI.AddField("XZQDM", ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString, "行政区代码");
                    if (DLTBNMKAPI != null && DLTBNMKAPI.FeatureClass.FindField("XZQTZLX") == -1)
                        DLTBNMKAPI.AddField("XZQTZLX", ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeInteger, "行政区调整类型");
                    tempLayer = new FeatureLayer() { Name = "地类图斑年末库", FeatureClass = DLTBNMKAPI.FeatureClass };
                    #region 设置图层样式
                    tempLayer.MinimumScale = 25000;
                    tempLayer.MaximumScale = 0;
                    #endregion
                    _DataCatalog.AddLayer(tempLayer, GroupLayerInfoNM);
                }
                _DataCatalog.UpdateTree();
                Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "SaveProject" });
                Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "InitProject" });
                NmWsAPI?.CloseWorkspace();
                DLTBNMKAPI?.CloseFeatureClass();
            }
            catch (Exception ex)
            {
                MessageHelper.ShowTips("系统设置初始化页面失败:" + ex.Message);
                LogAPI.Debug(ex);
            }
            finally
            {
                wsAPI?.CloseWorkspace();
            }
        }
        private void SetILayerSymbol(IFeatureLayer tempLayer, string LayerAliseName)
        {
            IFeatureRenderer result = null;
            LayerCfg layerCfg = SystemCfg.ZLLayerLoadCfg.FirstOrDefault(x => x.FcName == LayerAliseName);//默认配置默认不为NULL
            if (layerCfg == null)
                layerCfg = SystemCfg.ZLLayerLoadCfg[0].Layers.FirstOrDefault(x => x.FcName == LayerAliseName);//默认配置默认不为NULL
            if (layerCfg != null && !string.IsNullOrWhiteSpace(layerCfg.Symbol))
            {
                AdvancedDrawingInfo ad = AdvancedDrawingInfo.FromJson(layerCfg.Symbol);
                if (ad != null)
                {
                    if (ad.DrawingInfo.Renderer is Framework.LayerStyleConvert.XSDClass.SimpleRenderer)
                    {
                        Symbol symbol1 = (ad.DrawingInfo.Renderer as Framework.LayerStyleConvert.XSDClass.SimpleRenderer).Symbol;
                        ISimpleRenderer simpleRander2 = SymbolConvert.Instance().GetSimpleRenderer(symbol1, SymbolTypeEnum.Fill);
                        result = simpleRander2 as IFeatureRenderer;
                    }
                    else if (ad.DrawingInfo.Renderer is Framework.LayerStyleConvert.XSDClass.UniqueValueRenderer)
                    {
                        Renderer rander = ad.DrawingInfo.Renderer;
                        IUniqueValueRenderer uniqueValueRander = SymbolConvert.Instance().GetUniqueValueRenderer(rander, SymbolTypeEnum.Fill);
                        result = uniqueValueRander as IFeatureRenderer;
                    }
                }
                #region 样式
                if (result != null)
                    (tempLayer as IGeoFeatureLayer).Renderer = result;
                #endregion
                #region 显示比例设置
                tempLayer.MinimumScale = layerCfg.MinScale;
                tempLayer.MaximumScale = layerCfg.MaxScale;
                #endregion
                #region 图层透明度
                if (tempLayer is ILayerEffects mLayerEffects)//透明度
                    mLayerEffects.Transparency = (short)layerCfg.Transparency;
                #endregion
                #region 是否显示
                tempLayer.Visible = layerCfg.Visible;//是否显示
                #endregion
                #region 是否可选择
                tempLayer.Selectable = layerCfg.Selectable;
                #endregion
                #region 过滤条件
                IFeatureLayerDefinition pFLDefinition = tempLayer as IFeatureLayerDefinition;
                if (pFLDefinition != null)
                {
                    pFLDefinition.DefinitionExpression = layerCfg.DefinitionExpression;
                }
                #endregion
            }
        }
        public override void OnCreate(object Hook)
        {
            if (hookHelper == null)
                hookHelper = new HookHelperClass();
            hookHelper.Hook = Hook;
            pEditor = new EngineEditorClass();
        }
        public override bool Enabled
        {
            get
            {
                //验证是否打开工程
                if (!(MapsManager.Instance.MapService.GetProjectInfo() is ProjectInfo ProInfo))
                    return false;
                else
                    return string.IsNullOrWhiteSpace(ProInfo.ZLDatabase) && !string.IsNullOrWhiteSpace(ProInfo.BGDatabase);//对应BUG:6333,创建变更数据库后才能创建增量数据库
            }
        }
    }
}