using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.Utils;
using Kingo.Plugin.EngineEditor.Common;
using KGIS.Framework.Utils.Helper;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Kingo.Plugin.EngineEditor.Views
{
    public delegate void FeatureSelectEventHandler();
    /// 
    /// FrmFeatureSelected.xaml 的交互逻辑
    /// 
    public partial class FrmFeatureSelected : Window
    {
        public int OID;
        EngineEditorClass m_editor = null;
        ISelectionSet pSelectionSet = null;
        //List listSelectObjectID;
        List listSelectBitmap;
        ImageList imageListSmall = new ImageList();//产生图像对象
        private IHookHelper M_hookHelper = new HookHelper();
        ILayer layer = null;
        IFeatureLayer pFeatureLayer = null;
        public bool bReturn = false;
        public event FeatureSelectEventHandler featureHandler;
        IGeoFeatureLayer GeoFeatureLayer;
        IQueryFilter queryFilter = null;
        IFeatureCursor pFeatureCursor = null;
        IDictionary pOid_DLBM = new Dictionary();
        IFeature pFeature = null;
        BitmapScaleHelper pBitmapHelper = new BitmapScaleHelper();
        public FrmFeatureSelected()
        {
            InitializeComponent();
            bReturn = true;
            if (m_editor == null)
            {
                m_editor = new EngineEditorClass();
            }
            Init();
        }
        /// 
        /// Edit Tool 左键 "数据切换"
        /// 
        /// 
        /// 
        public FrmFeatureSelected(IHookHelper m_hookHelper, List item)
        {
            InitializeComponent();
            try
            {
                Init();
                bReturn = true;
                Bitmap bitmap = null;
                int[] selected = new int[1];
                if (m_editor == null)
                {
                    m_editor = new EngineEditorClass();
                }
                this.Title = m_editor.TargetLayer.Name;
                //取消当前列名
                //this.nameFine.Header = Title;
                M_hookHelper = m_hookHelper;
                //this.listView1.View = item;
                string where = null;
                for (int i = 0; i < item.Count; i++)
                {
                    //this.listView1.Items.Add(item[i]);
                    where += " OBJECTID=" + item[i] + " or";
                }
                layer = m_editor.TargetLayer;
                pFeatureLayer = layer as IFeatureLayer;
                pSelectionSet = (pFeatureLayer as IFeatureSelection).SelectionSet;
                IEnumIDs enumIDs = pSelectionSet.IDs;
                enumIDs.Reset();
                int objectid = enumIDs.Next();
                if (objectid > 0)
                {
                    where = where.Substring(0, where.Length - 2);
                    queryFilter.WhereClause = where;
                    GeoFeatureLayer = layer as IGeoFeatureLayer;
                    pFeatureCursor = pFeatureLayer.Search(queryFilter, true);
                    if (!GetDLBMByOid(item.ToArray()))
                    {
                        LogAPI.Debug("要素转换器打开异常:GetDLBMByOid方法获取地类图斑失败");
                        return;
                    }
                    IDictionary pDic = GetSymbol(GeoFeatureLayer, pFeatureCursor);
                    #region 注释
                    //方法1 缺点,存在相同的图斑报错,原因pDic是主键,不存相同图斑
                    //foreach (KeyValuePair item1 in pDic)
                    //{
                    //    bitmap = PreViewFillSymbol(item1.Value, 30, 30);
                    //    selected[0] = 4;
                    //    bitmap = PhotoScreenShot(bitmap, 3, 3, selected)[0];
                    //    imageListSmall.Images.Add(bitmap);
                    //}
                    //for (int i = 0; i < item.Count; i++)
                    //{
                    //    this.listView1.Items.Add(new FeatureConversion(item[i], (Bitmap)imageListSmall.Images[imageListSmall.Images.Count - i - 1]));
                    //    if (item[i].ToString() == objectid.ToString())
                    //    {
                    //        this.listView1.SelectedIndex = i;
                    //    }
                    //}
                    // 
                    #endregion
                    //方法2
                    foreach (KeyValuePair pair in pOid_DLBM)
                    {
                        if (bitmap != null)
                        {
                            bitmap.Dispose();
                            bitmap = null;
                        }
                        if (!string.IsNullOrWhiteSpace(pair.Value) && pDic.ContainsKey(pair.Value))
                        {
                            bitmap = pBitmapHelper.PreViewFillSymbol(pDic[pair.Value], 30, 30);
                            selected[0] = 4;
                            bitmap = pBitmapHelper.PhotoScreenShot(bitmap, 3, 3, selected)[0];
                        }
                        if (bitmap == null)
                        {
                            bitmap = new Bitmap(10, 10);
                        }
                        this.listView1.Items.Add(new FeatureConversion(pair.Key, bitmap));
                        if (pair.Key == objectid)
                        {
                            this.listView1.SelectedIndex = this.listView1.Items.Count - 1;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug("要素转换器打开异常:" + ex);
            }
            finally
            {
                if (pFeature != null)
                {
                    Marshal.ReleaseComObject(pFeature);
                }
                if (pFeatureCursor != null)
                {
                    Marshal.ReleaseComObject(pFeatureCursor);
                }
                GC.Collect();
            }
        }
        public FrmFeatureSelected(IHookHelper m_hookHelper, Dictionary> keyValuePairs)
        {
            InitializeComponent();
            try
            {
                Init();
                bReturn = true;
                Bitmap bitmap = null;
                if (m_editor == null)
                    m_editor = new EngineEditorClass();
                M_hookHelper = m_hookHelper;
                this.listView1.Items.Clear();
                foreach (var item in keyValuePairs)
                {
                    foreach (var itemOIDs in item.Value)
                    {
                        if (bitmap == null)
                            bitmap = new Bitmap(9, 9);
                        this.listView1.Items.Add(new FeatureConversion(item.Key, itemOIDs, bitmap));
                    }
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug("要素转换器打开异常:" + ex);
            }
            finally
            {
                if (pFeature != null)
                {
                    Marshal.ReleaseComObject(pFeature);
                }
                if (pFeatureCursor != null)
                {
                    Marshal.ReleaseComObject(pFeatureCursor);
                }
                GC.Collect();
            }
        }
        private IDictionary GetSymbol(IGeoFeatureLayer pGeoFeatureLayer, IFeatureCursor pFeatureCursor)
        {
            IDictionary pDic = new Dictionary();
            LabelAPI.GetSymbolInfos(pGeoFeatureLayer.Renderer, pFeatureCursor, pDic);
            return pDic;
        }
        private void Init()
        {
            //是否展示“识别列表”
            this.staPanel.Visibility = Visibility.Collapsed;
            this.featureHandler += new FeatureSelectEventHandler(SelectChange);
            if (listSelectBitmap == null)
            {
                listSelectBitmap = new List();
            }
            if (queryFilter == null)
            {
                queryFilter = new QueryFilterClass();
            }
        }
        private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            //SelectChange();
            if (featureHandler != null)
            {
                featureHandler();
            }
        }
        /// 
        /// 根据OID获得DLBM
        /// 
        /// oid数组
        /// 
        public bool GetDLBMByOid(int[] item)
        {
            pOid_DLBM.Clear();
            string DLBM = null;
            if (pFeatureLayer == null)
            {
                return false;
            }
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
            for (int i = 0; i < item.Length; i++)
            {
                pFeature = pFeatureClass.GetFeature(item[i]);
                for (int j = 0; j < pFeature.Fields.FieldCount; j++)
                {
                    IField field = pFeature.Fields.get_Field(j);
                    if (field.Name.ToUpper() != "DLBM" || field.AliasName != "地类编码")
                        continue;
                    if (pFeature.get_Value(j) is DBNull || pFeature.get_Value(j) == null)
                    {
                        DLBM = null;
                    }
                    else
                    {
                        DLBM = pFeature.get_Value(j).ToString().Trim();
                    }
                }
                pOid_DLBM.Add(item[i], DLBM);
            }
            return true;
        }
        public void SelectChange(bool IsTest)
        {
            //先清除地图上所有选中要素,但目标图用来选中查询的图层选中图形不清除
            ESRI.ArcGIS.Geometry.IGeometry gg = (m_editor as IEngineEditSketch).Geometry;
            this.M_hookHelper.FocusMap.ClearSelection();
            //获取用户选择的OBJECTID
            FeatureConversion conversion = listView1.SelectedItem as FeatureConversion;
            OID = conversion.OBJECTID;
            //OID = listView1.SelectedItem;
            pSelectionSet = (pFeatureLayer as IFeatureSelection).SelectionSet;
            IFeatureClass pFeatureclass = pFeatureLayer.FeatureClass;
            IQueryFilter pQuery = new QueryFilterClass();
            pQuery.WhereClause = "OBJECTID=" + OID + "";
            IFeatureCursor cursor = pFeatureclass.Search(pQuery, true);
            IFeature pFeature = cursor.NextFeature();
            if (pFeature != null)
            {
                (M_hookHelper.Hook as IMapControlDefault).Map.SelectFeature((pFeatureLayer as ILayer), pFeature);
                //KGIS.Common.Utility.CommonAPI.MoveToCenterBySelectFeature(M_hookHelper.Hook as IMapControlDefault, (pFeatureLayer as ILayer), pFeature);
            }
            this.M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent);
            //-------------------------------------
            #region 
            //if (listSelectObjectID == null)
            //{
            //    listSelectObjectID = new List();
            //}
            //清除选集
            //pSelectionSet.RemoveList(pSelectionSet.Count, ref listSelectObjectID.ToArray()[0]);
            //listSelectObjectID.Clear();
            //listSelectObjectID.Add(OID);
            //先清除地图上所有选中要素,但目标图用来选中查询的图层选中图形不清除
            //pSelectionSet.AddList(listSelectObjectID.Count, ref listSelectObjectID.ToArray()[0]);
            //M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent);
            //this.M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent);
            //IFeatureClass pFeatureclass = pFeatureLayer.FeatureClass;
            //IQueryFilter pQuery = new QueryFilterClass();
            //pQuery.WhereClause = "OBJECTID=" + OID + "";
            //IFeatureCursor cursor = pFeatureclass.Search(pQuery, true);
            //IFeature pFeature = cursor.NextFeature();
            //if (pFeature != null)
            //{
            //    (m_editor as IEngineEditSketch).Geometry = pFeature.Shape;
            //}
            //IFeatureSelection pFeatureSele = M_hookHelper.ActiveView.FocusMap.FeatureSelection as IFeatureSelection;
            //if (pFeatureSele != null)
            //{
            //    pFeatureSele.Add();
            //}
            //IEnumFeature pEnumFeature1 = (M_hookHelper.ActiveView.FocusMap.FeatureSelection) as IEnumFeature;
            //IEnumFeature pEnumFeature = (pSelectionSet as IFeatureSelection) as IEnumFeature;
            //IFeature pFeature = pEnumFeature1.Next();
            //if(pFeature!=null)
            //{
            //    (m_editor as IEngineEditSketch).Geometry = pFeature.ShapeCopy;
            //}
            #endregion
        }
        public void SelectChange()
        {
            //先清除地图上所有选中要素,但目标图用来选中查询的图层选中图形不清除
            ESRI.ArcGIS.Geometry.IGeometry gg = (m_editor as IEngineEditSketch).Geometry;
            this.M_hookHelper.FocusMap.ClearSelection();
            //获取用户选择的OBJECTID
            FeatureConversion conversion = listView1.SelectedItem as FeatureConversion;
            OID = conversion.OBJECTID;
            pFeatureLayer = KGIS.Framework.Maps.MapsManager.Instance.MapService.GetFeatureLayerByName(conversion.LayerNameByOID);
            IQueryFilter pQuery = new QueryFilterClass
            {
                WhereClause = "OBJECTID=" + OID + ""
            };
            IFeatureCursor cursor = pFeatureLayer.FeatureClass.Search(pQuery, true);
            IFeature pFeature = cursor.NextFeature();
            if (pFeature != null)
            {
                (M_hookHelper.Hook as IMapControlDefault).Map.SelectFeature((pFeatureLayer as ILayer), pFeature);
            }
            this.M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent);
        }
        private void form_closed(object sender, EventArgs e)
        {
            //this.DialogResult = true;
            GC.Collect();
            this.Close();
            bReturn = false;
        }
        private void listView1_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                if (featureHandler != null)
                {
                    featureHandler();
                }
            }
        }
        private void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            int currentOid = listView1.SelectedIndex;
            if (currentOid > -1 && currentOid < listView1.Items.Count - 1)
            {
                ++currentOid;
            }
            else if (currentOid == listView1.Items.Count - 1)
            {
                currentOid = 0;
            }
            listView1.SelectedIndex = currentOid;
        }
        private void Btnlist_Click(object sender, RoutedEventArgs e)
        {
            if (this.staPanel.Visibility == Visibility.Visible)
            {
                this.staPanel.Visibility = Visibility.Collapsed;
            }
            else if (this.staPanel.Visibility == Visibility.Collapsed)
            {
                this.staPanel.Visibility = Visibility.Visible;
            }
        }
        public bool? ShowInMainForm(bool isModel = false)
        {
            this.ShowInTaskbar = false;
            if (System.Windows.Application.Current != null)
            {
                this.Owner = System.Windows.Application.Current.MainWindow;
            }
            else
            {
                WindowInteropHelper helper = new WindowInteropHelper(this);
                helper.Owner = ExtensionShowWindow.MainWinForm.Handle;
                System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(this);
            }
            if (isModel)
            {
                return this.ShowDialog();
            }
            else
            {
                this.Show();
                return true;
            }
        }
    }
    public class FeatureConversion
    {
        private ImageSource img { get; set; }
        private int objectid { get; set; }
        private string layerNameByOID { get; set; }
        public ImageSource IMG
        {
            get
            {
                return img;
            }
        }
        public int OBJECTID
        {
            get
            {
                return objectid;
            }
        }
        /// 
        /// 对应的图层名字
        /// 
        public string LayerNameByOID
        {
            get
            {
                return layerNameByOID;
            }
        }
        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);
        public static ImageSource ChangeBitmapToImageSource(Bitmap bitmap)
        {
            IntPtr hBitmap = bitmap.GetHbitmap();
            ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                hBitmap,
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());
            if (!DeleteObject(hBitmap))
            {
                if (hBitmap != null)
                {
                    Marshal.FreeCoTaskMem(hBitmap);
                }
                else
                    throw new System.ComponentModel.Win32Exception();
            }
            return wpfBitmap;
        }
        public FeatureConversion(int oid, Bitmap img)
        {
            this.objectid = oid;
            this.img = ChangeBitmapToImageSource(img);
        }
        public FeatureConversion(string layerNamebyOID, int oid, Bitmap img)
        {
            this.layerNameByOID = layerNamebyOID;
            this.objectid = oid;
            this.img = ChangeBitmapToImageSource(img);
        }
        public FeatureConversion(int oid, ImageSource img)
        {
            this.img = img;
            this.objectid = oid;
        }
    }
}