using System;
using System.Collections.Generic;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.DataSourcesFile;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Drawing;
using System.Xml.Linq;
using System.Data;
using System.Xml;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using KGIS.Framework.Platform;
using KGIS.Framework.Maps;
using Kingo.Plugin.MapView.Entity;
using Kingo.PluginServiceInterface;
namespace Kingo.Plugin.MapView.Views
{
    /// 
    /// UCLayerStyleSet.xaml 的交互逻辑
    /// 
    public partial class UCLayerStyleSet : BaseWindow
    {
        private string m_CurrentName = string.Empty;
        private ILayer m_Layer;
        private esriGeometryType GeometryType;
        private IStyleGalleryClass m_SymbologyStyleClass;
        private ISymbol m_Symbol;
        private IFillSymbol m_FillSymbol;
        private IActiveView _activeView;
        //private IHookHelper m_hookHelper { get; set; }
        public UCLayerStyleSet(ILayer layer)
        {
            InitializeComponent();
            //this.m_hookHelper = hookHelper;
            this.m_Layer = layer;
            //IFeatureLayer feature = this.m_Layer as IFeatureLayer;
            //this.m_CurrentName = feature.FeatureClass.AliasName;
            this.m_CurrentName = layer.Name;
            this.Title = m_CurrentName + "图层样式设置";
            InitData();
            _activeView = MapsManager.Instance.MapService.getAxMapControl().ActiveView;
        }
        private void InitData()
        {
            try
            {
                IFeatureLayer2 featureLayer = this.m_Layer as IFeatureLayer2;
                if (featureLayer != null)
                {
                    this.GeometryType = featureLayer.ShapeType;
                    switch (this.GeometryType)
                    {
                        case esriGeometryType.esriGeometryPoint:
                            this.m_SymbologyStyleClass = new MarkerSymbolStyleGalleryClassClass();
                            break;
                        case esriGeometryType.esriGeometryPolyline:
                            this.m_SymbologyStyleClass = new LineSymbolStyleGalleryClassClass();
                            break;
                        case esriGeometryType.esriGeometryPolygon:
                            this.m_SymbologyStyleClass = new FillSymbolStyleGalleryClassClass();
                            break;
                    }
                    ISimpleRenderer simpleRenderer = (featureLayer as IGeoFeatureLayer).Renderer as ISimpleRenderer;
                    if (simpleRenderer != null)
                    {
                        this.m_Symbol = simpleRenderer.Symbol;
                    }
                    else
                    {
                        this.m_Symbol = GetDefaultSymbol(this.GeometryType);
                    }
                    this.m_FillSymbol = (this.m_Symbol as IFillSymbol);
                }
                BindSelection();
            }
            catch (Exception ex)
            {
                LogAPI.Debug(ex.Message);
            }
        }
        private ISymbol GetDefaultSymbol(esriGeometryType geometryType)
        {
            try
            {
                ISymbol result = null;
                IRgbColor rgbColor = new RgbColorClass();
                rgbColor.Red = 184;
                rgbColor.Green = 242;
                rgbColor.Blue = 200;
                switch (geometryType)
                {
                    case esriGeometryType.esriGeometryPoint:
                        result = (new SimpleMarkerSymbolClass
                        {
                            Color = rgbColor,
                            Style = esriSimpleMarkerStyle.esriSMSCircle
                        } as ISymbol);
                        goto IL_B3;
                    case esriGeometryType.esriGeometryMultipoint:
                        goto IL_B3;
                    case esriGeometryType.esriGeometryPolyline:
                        break;
                    case esriGeometryType.esriGeometryPolygon:
                        result = (new SimpleFillSymbolClass
                        {
                            Color = rgbColor,
                            Style = esriSimpleFillStyle.esriSFSSolid
                        } as ISymbol);
                        goto IL_B3;
                    default:
                        if (geometryType != esriGeometryType.esriGeometryLine)
                        {
                            goto IL_B3;
                        }
                        break;
                }
                result = (new SimpleLineSymbolClass
                {
                    Color = rgbColor,
                    Width = 1.0,
                    Style = esriSimpleLineStyle.esriSLSSolid
                } as ISymbol);
            IL_B3:
                return result;
            }
            catch (Exception ex)
            {
                LogAPI.Debug(ex.Message);
            }
            return null;
        }
        private void Close(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        /// 
        /// 绑定选中的图层样式
        /// 
        private void BindSelection()
        {
            IWorkspaceFactory pWSFactory = null;
            IFeatureClass SourceFeatureClass = null;
            try
            {
                string appLayerConfigspath = System.IO.Path.Combine((MapsManager.Instance.CurrProjectInfo as ProjectInfo).ProjDir, "AppLayerConfigs.xml");
                if (!System.IO.File.Exists(appLayerConfigspath))
                {
                    XmlDataDocument xml = new XmlDataDocument();
                    XmlElement layersElement = xml.CreateElement("Layers");
                    xml.AppendChild(layersElement);
                    xml.Save(appLayerConfigspath);
                }
                bool isHave = false;//图层配置默认没有
                LayerEntity selectEntity = new LayerEntity();
                XDocument xDoc = XDocument.Load(appLayerConfigspath);
                XElement element = xDoc.Element("Layers");
                foreach (var item in element.Elements("Layer"))
                {
                    if (item.Attribute("LayerCaption").Value == m_CurrentName)
                    {
                        isHave = true;
                        selectEntity.LayerName = item.Attribute("LayerName").Value;
                        selectEntity.LayerLableName = item.Attribute("LayerLableName").Value;
                        selectEntity.LayerCaption = item.Attribute("LayerCaption").Value;
                        selectEntity.LayerBorderStyle = int.Parse(item.Attribute("LayerBorderStyle").Value);
                        selectEntity.LayerBorderWidth = double.Parse(item.Attribute("LayerBorderWidth").Value);
                        selectEntity.LayerFillColor = ColorTranslator.FromHtml(item.Attribute("LayerFillColor").Value);
                        selectEntity.LayerBorderColor = ColorTranslator.FromHtml(item.Attribute("LayerBorderColor").Value);
                        selectEntity.LayerLableColor = ColorTranslator.FromHtml(item.Attribute("LayerLableColor").Value);
                        if (item.Attribute("LayerPath") != null)
                        {
                            selectEntity.LayerPath = item.Attribute("LayerPath").Value;
                        }
                        break;
                    }
                }
                if (isHave == false)
                {
                    selectEntity.LayerCaption = m_CurrentName;
                    selectEntity.LayerBorderStyle = 0;
                    selectEntity.LayerBorderWidth = 1;
                    Color fillColor = Converter.FromRGBColor(this.m_FillSymbol.Color as IRgbColor);
                    selectEntity.LayerFillColor = fillColor;
                    selectEntity.LayerBorderColor = Converter.FromRGBColor(this.m_FillSymbol.Outline.Color as IRgbColor);
                    selectEntity.LayerLableColor = ColorTranslator.FromHtml("#FF000000");
                }
                LayerLabelName.Items.Clear();
                if (this.m_Layer is IFeatureLayer)
                {
                    try
                    {
                        IFeatureLayer featureLayer = this.m_Layer as IFeatureLayer;
                        if (featureLayer != null)
                            SourceFeatureClass = featureLayer.FeatureClass;
                    }
                    catch (Exception ex)
                    {
                        LogAPI.Debug(ex);
                    }
                    if (SourceFeatureClass != null)
                    {
                        for (int i = 0; i < SourceFeatureClass.Fields.FieldCount; i++)
                        {
                            IField field = SourceFeatureClass.Fields.Field[i];
                            if (field.Name.ToLower().Contains("shape"))
                                continue;
                            LayerLabelName.Items.Add(field.Name);
                        }
                    }
                    LayerLabelName.SelectedItem = selectEntity.LayerLableName;
                }
                //图层边框样式
                LayerBorderStyle.SelectedValue = selectEntity.LayerBorderStyle;
                //图层边框宽度
                LayerBorderWidth.Text = selectEntity.LayerBorderWidth.ToString();
                //图层填充颜色
                LayerFillColor.Color = System.Windows.Media.Color.FromArgb(selectEntity.LayerFillColor.A, selectEntity.LayerFillColor.R, selectEntity.LayerFillColor.G, selectEntity.LayerFillColor.B);
                //图层边框颜色
                LayerBorderColor.Color = System.Windows.Media.Color.FromArgb(selectEntity.LayerBorderColor.A, selectEntity.LayerBorderColor.R, selectEntity.LayerBorderColor.G, selectEntity.LayerBorderColor.B);
                //标注填充颜色
                LayerLableColor.Color = System.Windows.Media.Color.FromArgb(selectEntity.LayerLableColor.A, selectEntity.LayerLableColor.R, selectEntity.LayerLableColor.G, selectEntity.LayerLableColor.B);
            }
            catch (Exception ex)
            {
                LogAPI.Debug(ex.Message);
                MessageHelper.ShowError(ex.Message);
            }
            finally
            {
                if (pWSFactory != null)
                    Marshal.ReleaseComObject(pWSFactory);
            }
        }
        /// 
        /// 获取图层筛选中的图层
        /// 
        /// 
        private void btnSave_MouseLeftButtonDown(object sender, RoutedEventArgs e)
        {
            try
            {
                string appLayerConfigspath = System.IO.Path.Combine((MapsManager.Instance.CurrProjectInfo as ProjectInfo).ProjDir, "AppLayerConfigs.xml");
                bool configisHave = false;//默认没有配置
                IMapControlDefault mapcontrol = MapsManager.Instance.MapService.Hook as IMapControlDefault;
                XDocument xDoc = XDocument.Load(appLayerConfigspath);
                XElement element = xDoc.Element("Layers");
                foreach (var item in element.Elements("Layer"))
                {
                    if (item.Attribute("LayerCaption").Value == m_CurrentName)
                    {
                        configisHave = true;
                        string layerLabelName = LayerLabelName.SelectedItem == null ? "" : LayerLabelName.SelectedItem.ToString();
                        item.SetAttributeValue("LayerLableName", layerLabelName);
                        item.SetAttributeValue("LayerBorderStyle", LayerBorderStyle.SelectedValue.ToString());
                        item.SetAttributeValue("LayerBorderWidth", LayerBorderWidth.Text.Trim());
                        item.SetAttributeValue("LayerFillColor", System.Windows.Media.Color.FromArgb(LayerFillColor.Color.A, LayerFillColor.Color.R, LayerFillColor.Color.G, LayerFillColor.Color.B));
                        item.SetAttributeValue("LayerBorderColor", System.Windows.Media.Color.FromArgb(LayerBorderColor.Color.A, LayerBorderColor.Color.R, LayerBorderColor.Color.G, LayerBorderColor.Color.B));
                        item.SetAttributeValue("LayerLableColor", System.Windows.Media.Color.FromArgb(LayerLableColor.Color.A, LayerLableColor.Color.R, LayerLableColor.Color.G, LayerLableColor.Color.B));
                        List lstField = ReadlistfromXml(item.Elements("LayerField"));
                        bool isHave = false;
                        foreach (LayerField field in lstField)
                        {
                            if (field.Name == layerLabelName)
                            {
                                isHave = true;
                            }
                        }
                        if (!isHave)
                        {
                            XmlDocument xmlDoc = new XmlDocument();
                            XElement newElement = new XElement("LayerField");
                            newElement.Add(new XAttribute("Name", layerLabelName));
                            newElement.Add(new XAttribute("Alias", layerLabelName));
                            item.Add(newElement);
                        }
                        SeDataCatalogStyle(layerLabelName);
                        break;
                    }
                }
                element.Save(appLayerConfigspath);
                if (configisHave == false)//在配置文件中未找到图层的配置项
                {
                    XElement xLayer = new XElement("Layer");
                    IFeatureLayer feature = this.m_Layer as IFeatureLayer;
                    string layerNameStr = feature.Name;
                    string layerCaptionStr = feature.FeatureClass.AliasName;
                    //图层别名
                    XAttribute layerName = new XAttribute("LayerName", layerNameStr);
                    //图层别名
                    XAttribute layerCaption = new XAttribute("LayerCaption", layerCaptionStr);
                    //边框样式
                    XAttribute layerBorderStyle = new XAttribute("LayerBorderStyle", LayerBorderStyle.SelectedValue.ToString());
                    //边框宽度
                    XAttribute layerBorderWidth = new XAttribute("LayerBorderWidth", LayerBorderWidth.Text.Trim());
                    //填充颜色
                    XAttribute layerFillColor = new XAttribute("LayerFillColor", System.Windows.Media.Color.FromArgb(LayerFillColor.Color.A, LayerFillColor.Color.R, LayerFillColor.Color.G, LayerFillColor.Color.B));
                    //边框颜色
                    XAttribute layerBorderColor = new XAttribute("LayerBorderColor", System.Windows.Media.Color.FromArgb(LayerBorderColor.Color.A, LayerBorderColor.Color.R, LayerBorderColor.Color.G, LayerBorderColor.Color.B));
                    //标签颜色
                    XAttribute layerLableColor = new XAttribute("LayerLableColor", System.Windows.Media.Color.FromArgb(LayerLableColor.Color.A, LayerLableColor.Color.R, LayerLableColor.Color.G, LayerLableColor.Color.B));
                    XAttribute layerLableName = new XAttribute("LayerLableName", "");
                    xLayer.Add(layerName, layerCaption, layerBorderStyle, layerBorderWidth, layerFillColor, layerBorderColor, layerLableColor, layerLableName);
                    element.Add(xLayer);
                    xDoc.Save(appLayerConfigspath);
                    SeDataCatalogStyle();
                }
                this.Close();
            }
            catch (Exception ex)
            {
                LogAPI.Debug(ex.Message);
                MessageHelper.ShowError("保存失败:"+ex.Message);
            }
        }
        private void SeDataCatalogStyle(string layerLabelName = "")
        {
            try
            {
                if (this.m_FillSymbol != null)
                {
                    //填充颜色
                    IColor color = this.m_FillSymbol.Color;
                    Color fillColor = System.Drawing.Color.FromArgb(LayerFillColor.Color.A, LayerFillColor.Color.R, LayerFillColor.Color.G, LayerFillColor.Color.B);
                    color = (IColor)Converter.ToRGBColor(fillColor);
                    color.Transparency = LayerFillColor.Color.A;
                    this.m_FillSymbol.Color = color;
                    //设置边框颜色、样式、宽度
                    ISimpleLineSymbol pMarkerLineSymbol = new SimpleLineSymbolClass();
                    Color borderColor = System.Drawing.Color.FromArgb(LayerBorderColor.Color.A, LayerBorderColor.Color.R, LayerBorderColor.Color.G, LayerBorderColor.Color.B);
                    IColor outlineColor = (IColor)Converter.ToRGBColor(borderColor);
                    pMarkerLineSymbol.Width = Math.Abs(Convert.ToDouble(LayerBorderWidth.Text.Trim()));
                    pMarkerLineSymbol.Color = outlineColor;
                    outlineColor.Transparency = this.LayerBorderColor.Color.A;
                    if (LayerBorderStyle.SelectedValue.ToString() == "0")//实线
                    {
                        pMarkerLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid;
                    }
                    else if (LayerBorderStyle.SelectedValue.ToString() == "1")//虚线
                    {
                        pMarkerLineSymbol.Style = esriSimpleLineStyle.esriSLSDash;
                    }
                    else if (LayerBorderStyle.SelectedValue.ToString() == "2")//点
                    {
                        pMarkerLineSymbol.Style = esriSimpleLineStyle.esriSLSDot;
                    }
                    else if (LayerBorderStyle.SelectedValue.ToString() == "3")//点划线
                    {
                        pMarkerLineSymbol.Style = esriSimpleLineStyle.esriSLSDashDot;
                    }
                    else if (LayerBorderStyle.SelectedValue.ToString() == "4")//两点划线
                    {
                        pMarkerLineSymbol.Style = esriSimpleLineStyle.esriSLSDashDotDot;
                    }
                    this.m_FillSymbol.Outline = pMarkerLineSymbol;
                    if (!string.IsNullOrWhiteSpace(layerLabelName))
                    {
                        IGeoFeatureLayer pGeoFeatureLayer = this.m_Layer as IGeoFeatureLayer;
                        pGeoFeatureLayer.AnnotationProperties.Clear();//必须执行,因为里面有一个默认的
                        IBasicOverposterLayerProperties pBasic = new BasicOverposterLayerPropertiesClass();
                        ITextSymbol pTextSymbol = new TextSymbolClass();
                        Color textColor = System.Drawing.Color.FromArgb(LayerLableColor.Color.A, LayerLableColor.Color.R, LayerLableColor.Color.G, LayerLableColor.Color.B);
                        IColor lableColor = (IColor)Converter.ToRGBColor(textColor);
                        ILabelEngineLayerProperties pLableEngine = new LabelEngineLayerPropertiesClass();
                        pTextSymbol.Color = lableColor;//设置字体颜色
                        string pLable = "[" + layerLabelName + "]";
                        pLableEngine.Expression = pLable;
                        pLableEngine.IsExpressionSimple = true;
                        pBasic.NumLabelsOption = esriBasicNumLabelsOption.esriOneLabelPerShape;
                        pLableEngine.BasicOverposterLayerProperties = pBasic;
                        pLableEngine.Symbol = pTextSymbol;
                        pGeoFeatureLayer.AnnotationProperties.Add(pLableEngine as IAnnotateLayerProperties);
                        pGeoFeatureLayer.DisplayAnnotation = true;
                        pLableEngine.Symbol = pTextSymbol;
                    }
                }
                _activeView.PartialRefresh(esriViewDrawPhase.esriViewAll, m_Layer, _activeView.Extent);
            }
            catch (Exception ex)
            {
                LogAPI.Debug(ex.Message);
                MessageHelper.ShowError(ex.Message);
            }
        }
        private List ReadlistfromXml(IEnumerable element)
        {
            var fields = new List();
            try
            {
                if (element != null && element.Count() > 0)
                {
                    foreach (var item in element)
                    {
                        var layerfield = new LayerField()
                        {
                            Name = item.Attribute("Name").Value,
                        };
                        fields.Add(layerfield);
                    }
                }
                return fields;
            }
            catch (Exception ex)
            {
                LogAPI.Debug(ex.Message);
                return fields;
            }
        }
        private void LayerBorderWidth_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                bool shiftKey = (Keyboard.Modifiers & ModifierKeys.Shift) != 0;//判断shifu键是否按下
                if (shiftKey == true)                  //当按下shift
                {
                    e.Handled = true;//不可输入
                }
                else                           //未按shift
                {
                    if (!((e.Key >= Key.D0 && e.Key <= Key.D9) || (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || e.Key == Key.Delete || e.Key == Key.Back || e.Key == Key.Tab || e.Key == Key.Enter))
                    {
                        e.Handled = true;//不可输入
                    }
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug(ex.Message);
            }
        }
        private void Layer_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            try
            {
                BindSelection();
            }
            catch (Exception ex)
            {
                LogAPI.Debug(ex.Message);
            }
        }
        private void Border_MouseDown(object sender, MouseButtonEventArgs e)
        {
            //this.DragMove();
        }
    }
}