using Microsoft.Xaml.Behaviors;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;

namespace FLY.ControlLibrary
{
    /// <summary>
    /// 后台添加功能，按钮按下 会切换 属性 状态, true变false,false 变true
    /// </summary>
    public class ToggleAction : IDisposable
    {
        /// <summary>
        /// 对象
        /// </summary>
        public object obj;
        /// <summary>
        /// bool 属性
        /// </summary>
        public string propertyname;

        UIElement uIElement;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="uIElement"></param>
        /// <param name="obj"></param>
        /// <param name="propertyname"></param>
        public ToggleAction(UIElement uIElement, object obj, string propertyname)
        {
            this.uIElement = uIElement;
            this.obj = obj;
            this.propertyname = propertyname;


            uIElement.PreviewMouseDown += UIElement_PreviewMouseDown;
            uIElement.PreviewTouchDown += UIElement_PreviewTouchDown;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="uIElement"></param>
        /// <param name="propertyname"></param>
        public ToggleAction(UIElement uIElement, string propertyname) : this(uIElement, null, propertyname) 
        {
        
        }
        
        /// <summary>
        /// 
        /// </summary>
        public void Dispose()
        {
            uIElement.PreviewMouseDown -= UIElement_PreviewMouseDown;
            uIElement.PreviewTouchDown -= UIElement_PreviewTouchDown;
        }


        private void UIElement_PreviewTouchDown(object sender, TouchEventArgs e)
        {
            Down();
        }
        private void UIElement_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            Down();
        }


        bool IsObjNull()
        {
            if (obj == null)
            {
                if (uIElement is FrameworkElement)
                {
                    obj = (uIElement as FrameworkElement).DataContext;
                    if (obj == null)
                        return true;
                }
                else
                {
                    return true;
                }
            }
            return false;
        }
        void Down()
        {
            if (IsObjNull()) return;

            var value = Misc.PropertiesManager.GetValue(obj, propertyname);
            var v = (bool)value;
            if (v)
                Misc.PropertiesManager.SetValue(obj, propertyname, false);
            else
                Misc.PropertiesManager.SetValue(obj, propertyname, true);
        }
    }


    /// <summary>
    /// ToggleAction 的 XAML 版 ，附加行为。
    /// 与 NoToggleButton 控件 一起使用
    /// </summary>
    public class ToggleBehavior : Behavior<UIElement>
    {
        /// <summary>
        /// 
        /// </summary>
        public System.Windows.Data.Binding Binding { get; set; }
        ToggleAction toggleAction = null;
        /// <summary>
        /// 
        /// </summary>
        public ToggleBehavior()
        {
        }

        /// <summary>
        /// 
        /// </summary>
        protected override void OnAttached()
        {
            base.OnAttached();
            UIElement dobj = AssociatedObject;
            if (Binding != null && Binding.Path != null)
            {
                if (Binding.Source != null)
                {
                    toggleAction = new ToggleAction(dobj, Binding.Source, Binding.Path.Path);
                }
                else
                {
                    var obj = COMMON.GetDataContext(dobj);
                    if (obj == null)
                    {
                        toggleAction = new ToggleAction(dobj, Binding.Path.Path);
                    }
                    else
                    {
                        toggleAction = new ToggleAction(dobj, obj, Binding.Path.Path);
                    }
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        protected override void OnDetaching()
        {
            base.OnDetaching();
            if (toggleAction != null)
            {
                toggleAction.Dispose();
                toggleAction = null;
            }

        }
    }
}
