using ComPDFKitViewer.AnnotEvent;
using PDF_Master.CustomControl.CompositeControl;
using PDF_Master.Helper;
using PDF_Master.Properties;
using PDFSettings;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;

namespace PDF_Master.Model.AnnotPanel
{
    //注释的通用属性
    public class AnnotCommon : BindableBase
    {
        //注释类型
        private AnnotArgsType _annotType;

        public AnnotArgsType AnnotType
        {
            get { return _annotType; }
            set => SetProperty(ref _annotType, value);
        }

        //注释类型名称
        private string _annotTypeTitle;

        public string AnnotTypeTitle
        {
            get { return _annotTypeTitle; }
            set => SetProperty(ref _annotTypeTitle, value);
        }

        #region 线条

        //线条粗细大小
        private double _annotThickness = 1;

        public double AnnotThickness
        {
            get { return _annotThickness; }
            set => SetProperty(ref _annotThickness, value);
        }

        //线条样式
        private DashStyle dash = new DashStyle();

        public DashStyle Dash
        {
            get { return dash; }
            set => SetProperty(ref dash, value);
        }

        #endregion 线条

        #region 填充

        //填充颜色透明度
        private double fillOpacity = 1;

        public double FillOpacity
        {
            get { return fillOpacity; }
            set => SetProperty(ref fillOpacity, value);
        }

        //当前填充颜色
        private Brush _currentFillColor = App.Current.FindResource("color.sys.layout.divider.text-date-fill") as Brush; 

        public Brush CurrentFillColor
        {
            get { return _currentFillColor; }
            set => SetProperty(ref _currentFillColor, value);
        }

        //填充颜色
        private Brush fillColor = new SolidColorBrush(Colors.Transparent);

        public Brush FillColor
        {
            get { return fillColor; }
            set { SetProperty(ref fillColor, value); CurrentFillColor = fillColor; }
        }

        //边框颜色集合
        private List<ColorItem> _colorItems = new List<ColorItem>();

        public List<ColorItem> ColorItems
        {
            get { return _colorItems; }
            set => SetProperty(ref _colorItems, value);
        }

        //填充颜色集合
        private List<ColorItem> _fillColorItems = new List<ColorItem>();

        public List<ColorItem> FillColorItems
        {
            get { return _fillColorItems; }
            set => SetProperty(ref _fillColorItems, value);
        }

        #endregion 填充

        #region 边框

        //边框颜色透明度
        private double _borderOpacity = 1;

        public double BorderOpacity
        {
            get { return _borderOpacity; }
            set => SetProperty(ref _borderOpacity, value);
        }

        private Brush _borderColor = new SolidColorBrush(Colors.Transparent);

        public Brush BorderColor
        {
            get { return _borderColor; }
            set { SetProperty(ref _borderColor, value); CurrentBorderColor = _borderColor; }
        }

        //当前边框颜色
        private Brush _currentBorderColor = App.Current.FindResource("color.sys.layout.divider.shapes-border") as Brush;

        public Brush CurrentBorderColor
        {
            get { return _currentBorderColor; }
            set => SetProperty(ref _currentBorderColor, value);
        }

        private Brush _fontColor = new SolidColorBrush(Colors.Transparent);

        public Brush FontColor
        {
            get { return _fontColor; }
            set { SetProperty(ref _fontColor, value); CurrentFontColor = _fontColor; }
        }

        //当前边框颜色
        private Brush _currentFontColor=App.Current.FindResource("color.sys.layout.divider.pen") as Brush;

        public Brush CurrentFontColor
        {
            get { return _currentFontColor; }
            set => SetProperty(ref _currentFontColor, value);
        }

        //是否为实线
        private bool _isSolidLine = true;

        public bool IsSolidLine
        {
            get { return _isSolidLine; }
            set => SetProperty(ref _isSolidLine, value);
        }

        //是否为虚线
        private bool _isDashLine = true;

        public bool IsDashLine
        {
            get { return _isDashLine; }
            set => SetProperty(ref _isDashLine, value);
        }

        //外部UI引用,其他:例如形状注释类型
        public string strOtherTag { get; private set; }

        //VM赋值
        public void SetOtherTag(string str)
        {
            strOtherTag = str;
        }

        #endregion 边框

        #region 多选

        //多选注释:用处 - 多选注释使得下拉框为空内容,刷新最新的UI布局
        private bool _isMultiSelected = false;

        public bool IsMultiSelected
        {
            get { return _isMultiSelected; }
            set => SetProperty(ref _isMultiSelected, value);
        }

        private bool isFreeHandSelected = true;

        public bool IsFreeHandSelected
        {
            get { return isFreeHandSelected; }
            set
            {
                SetProperty(ref isFreeHandSelected, value);
            }
        }

        private bool isSharpAnnotSelected = true;

        public bool IsSharpAnnotSelected
        {
            get { return isSharpAnnotSelected; }
            set
            {
                SetProperty(ref isSharpAnnotSelected, value);
            }
        }

        #endregion 多选

        /// <summary>
        /// VM触发到外部UI事件
        /// </summary>
        public event EventHandler<object> SelectedAnnotInvokeToUI;

        //Todo:由于考虑到有些UI在VM不太方便处理,因此需要触发该函数到外部xaml.cs里更改UI属性。
        //更改多个属性:value可为键值对集合
        //适应范围:若VM在Loaded进行绑定,需要UI初始化之后,才能起到作用
        public void InvokeToUI(object sender, object value)
        {
            SelectedAnnotInvokeToUI?.Invoke(sender, value);
        }
    }
}