using ESRI.ArcGIS.Carto;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Kingo.Plugin.MapView.Views
{
    /// 
    /// UCFieldCalculator.xaml 的交互逻辑
    /// 
    public partial class UCFieldCalculator : BaseWindow
    {
        public Expression expressionFieldCalculator { get; set; }
        private IFeatureLayer m_featureLayer;
        public UCFieldCalculator(IFeatureLayer featureLayer)
        {
            InitializeComponent();
            m_featureLayer = featureLayer;
            expressionFieldCalculator = new Expression();
            InItFieldList();
        }
        private void InItFieldList()
        {
            try
            {
                if (m_featureLayer == null || m_featureLayer.FeatureClass == null) return;
                List fields = new List();
                for (int i = 0; i < m_featureLayer.FeatureClass.Fields.FieldCount; i++)
                {
                    fields.Add(m_featureLayer.FeatureClass.Fields.Field[i].Name);
                }
                fieldListBox.ItemsSource = fields;
                if (fields.Count > 0)
                    fieldListBox.SelectedIndex = 0;
            }
            catch (Exception ex)
            {
                MessageHelper.ShowTips("获取数据类的字段列表异常!" + ex.Message);
                LogAPI.Debug("获取数据类的字段列表异常!" + ex.Message);
                LogAPI.Debug("获取数据类的字段列表异常!" + ex.StackTrace);
            }
        }
        private void FieldListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (expressionFieldCalculator == null)
                expressionFieldCalculator = new Expression();
            expressionFieldCalculator.Field = fieldListBox.SelectedItem.ToString();
            fieldLabel.Content = " " + fieldListBox.SelectedItem.ToString() + " = ";
        }
        private void BtnOK_Click(object sender, RoutedEventArgs e)
        {
            if (expressionFieldCalculator == null)
                expressionFieldCalculator = new Expression();
            expressionFieldCalculator.ExpressionText = contentBlock.Text.Trim();
            if (string.IsNullOrEmpty(expressionFieldCalculator.ExpressionText))
            {
                MessageHelper.ShowTips("请先编辑字段计算器!");
                this.DialogResult = false;
            }
            else
            {
                this.DialogResult = true;
                this.Close();
            }
        }
        private void BtnCancel_Click(object sender, RoutedEventArgs e)
        {
            expressionFieldCalculator = null;
            this.Close();
        }
        private void VB_Checked(object sender, RoutedEventArgs e)
        {
            if (expressionFieldCalculator == null)
                expressionFieldCalculator = new Expression();
            expressionFieldCalculator.Type = CODEType.VB;
        }
        private void Python_Checked(object sender, RoutedEventArgs e)
        {
            if (expressionFieldCalculator == null)
                expressionFieldCalculator = new Expression();
            expressionFieldCalculator.Type = CODEType.Python;
        }
        private void FigureRadioButton_Checked(object sender, RoutedEventArgs e)
        {
            if (expressionFieldCalculator == null)
                expressionFieldCalculator = new Expression();
            expressionFieldCalculator.DataType = DataType.FigureType;
        }
        private void StringRadioButton_Checked(object sender, RoutedEventArgs e)
        {
            if (expressionFieldCalculator == null)
                expressionFieldCalculator = new Expression();
            expressionFieldCalculator.DataType = DataType.StringType;
        }
        private void DateRadioButton_Checked(object sender, RoutedEventArgs e)
        {
            if (expressionFieldCalculator == null)
                expressionFieldCalculator = new Expression();
            expressionFieldCalculator.DataType = DataType.DateType;
        }
        private void ContentBlock_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (expressionFieldCalculator == null)
                expressionFieldCalculator = new Expression();
            expressionFieldCalculator.ExpressionText = contentBlock.Text;
        }
        private void FunctionListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (expressionFieldCalculator == null)
                expressionFieldCalculator = new Expression();
            System.Windows.Controls.ListBoxItem listBoxItem = functionListBox.SelectedItem as ListBoxItem;
            
            expressionFieldCalculator.Function = listBoxItem.Content.ToString();
            contentBlock.Text += " " + listBoxItem.Content.ToString() + " ";
        }
        private void BtnMultiplication_Click(object sender, RoutedEventArgs e)
        {
            contentBlock.Text += " * ";
        }
        private void BtnDivide_Click(object sender, RoutedEventArgs e)
        {
            contentBlock.Text += " / ";
        }
        private void BtnWith_Click(object sender, RoutedEventArgs e)
        {
            contentBlock.Text += " & ";
        }
        private void BtnAdd_Click(object sender, RoutedEventArgs e)
        {
            contentBlock.Text += " + ";
        }
        private void BtnSubtract_Click(object sender, RoutedEventArgs e)
        {
            contentBlock.Text += " - ";
        }
        private void BtnEqual_Click(object sender, RoutedEventArgs e)
        {
            contentBlock.Text += " = ";
        }
    }
    public class Expression
    {
        /// 
        /// 所选字段
        /// 
        public string Field { get; set; }
        /// 
        /// 解析程序类型
        /// 
        public CODEType Type { get; set; } = CODEType.Python;
        /// 
        /// 数据类型
        /// 
        public DataType DataType { get; set; } = DataType.StringType;
        /// 
        /// 函数
        /// 
        public object Function { get; set; }
        /// 
        /// 内容
        /// 
        public string ExpressionText { get; set; }
    }
    public enum CODEType
    {
        Python,
        VB
    }
    public enum DataType
    {
        StringType,
        FigureType,
        DateType
    }
}