using ComPDFKit.PDFAnnotation;
using ComPDFKitViewer;
using ComPDFKitViewer.AnnotEvent;
using ComPDFKitViewer.PdfViewer;
using PDF_Master.Helper;
using PDF_Master.Model;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;

namespace PDF_Master.ViewModels.Form
{

    public class RadioButtonPropertyViewModel : FormBaseVM, INavigationAware
    {

        #region Command
        public DelegateCommand<string> FieldNameTextChangedCommand { get; set; }
        public DelegateCommand<string> ToolTipTextChangedCommand { get; set; }

        //外观

        public DelegateCommand<object> ResetColorCommand { get; set; }
        public DelegateCommand<object> ResetColorCheckedBtnCommand { get; set; }

        public DelegateCommand<string> RadioMemberNameTextChangedCommand { get; set; }

        public DelegateCommand<object> LineStyleCommand { get; set; }
        #endregion

        #region 变量

        private CPDFViewer PDFViewer;
        private WidgetRadioButtonArgs radioButtonArgs;
        private IDialogService dialogs;
        public event EventHandler<int> SelectResetColorBtnHandler;
        #endregion


        #region 初始化
        public RadioButtonPropertyViewModel(IDialogService dialogService)
        {
            dialogs = dialogService;
            InitVariable();
            InitCommand();
        }

        private void InitVariable()
        {
            InitAllResetColor();
        }
        private void InitAllResetColor()
        {
            ResetColorOne = InitResetColor(Color.FromArgb(0xFF, 0x00, 0x00, 0x00), Color.FromArgb(0xFF, 0x00, 0x00, 0x00), Colors.Transparent);

            ResetColorTwo = InitResetColor(Color.FromArgb(0xFF, 0x00, 0x00, 0x00), Color.FromArgb(0xFF, 0xFF, 0x00, 0x00), Colors.Transparent);

            ResetColorThree = InitResetColor(Color.FromArgb(0xFF, 0x00, 0x00, 0x00), Color.FromArgb(0xFF, 0x18, 0xA0, 0xFB), Colors.Transparent);

            ResetColorForth = InitResetColor(Color.FromArgb(0xFF, 0x00, 0x00, 0x00), Color.FromArgb(0xFF, 0x10, 0xCB, 0x39), Colors.Transparent);
        }

        private void InitCommand()
        {

            //一般
            FieldNameTextChangedCommand = new DelegateCommand<string>(FieldNameTextChanged);
            ToolTipTextChangedCommand = new DelegateCommand<string>(ToolTipTextChanged);
            //外观
            ResetColorCheckedBtnCommand = new DelegateCommand<object>(ResetColorCheckedBtn);
            ResetColorCommand = new DelegateCommand<object>(ResetColorEvent);
            LineStyleCommand = new DelegateCommand<object>(LineStyleBtnEvent);

            //选项
            RadioMemberNameTextChangedCommand = new DelegateCommand<string>(RadioMemberNameTextChanged);
        }

        #endregion

        #region 事件


        private void FieldNameTextChanged(string obj)
        {
            if (string.IsNullOrEmpty(obj) == false && IsCurrentWidget == true)
            {
                FieldName = obj;

            }
        }

        private void ToolTipTextChanged(string obj)
        {
            if (string.IsNullOrEmpty(obj) == false && IsCurrentWidget == true)
            {
                ToolTipStr = obj;
            }
        }


        private void LineStyleBtnEvent(object obj)
        {
            if (obj != null)
            {
                switch ((string)obj)
                {
                    case "Solid":
                        BorderStyle = ComPDFKit.PDFAnnotation.C_BORDER_STYLE.BS_SOLID;
                        break;
                    case "Dotted":
                        BorderStyle = ComPDFKit.PDFAnnotation.C_BORDER_STYLE.BS_DASHDED;
                        break;
                }
            }
        }


        private void RadioMemberNameTextChanged(string obj)
        {
            if (obj != null && IsCurrentWidget == true)
            {
                RadioMemberName = obj;
            }
        }


        private void ResetColorCheckedBtn(object obj)
        {
            if (obj != null)
            {
                var str = obj as string;
                if (str != null)
                {
                    switch (str)
                    {
                        case "One":
                            BorderColor = ResetColorOne.BorderColor.Color;
                            ContentColor = ResetColorOne.FontColor.Color;
                            FillColor = ResetColorOne.FillColor.Color;
                            break;

                        case "Two":
                            BorderColor = ResetColorTwo.BorderColor.Color;
                            ContentColor = ResetColorTwo.FontColor.Color;
                            FillColor = ResetColorTwo.FillColor.Color;
                            break;

                        case "Three":
                            BorderColor = ResetColorThree.BorderColor.Color;
                            ContentColor = ResetColorThree.FontColor.Color;
                            FillColor = ResetColorThree.FillColor.Color;
                            break;

                        case "Forth":
                            BorderColor = ResetColorForth.BorderColor.Color;
                            ContentColor = ResetColorForth.FontColor.Color;
                            FillColor = ResetColorForth.FillColor.Color;
                            break;
                    }
                }
            }
        }

        private void ResetColorEvent(object obj)
        {
            bool result = true;
            DialogParameters value = new DialogParameters();
            value.Add(ParameterNames.PDFViewer, PDFViewer);
            dialogs.ShowDialog(DialogNames.EditPresetColorsDialog, value, e =>
            {
                if (e.Result != ButtonResult.OK)
                {
                    result = false;
                }
                EditPresetColorsDialogViewModel DialogVM = e.Parameters.GetValue<EditPresetColorsDialogViewModel>(ParameterNames.DataModel);
                if (DialogVM != null)
                {
                }
            });
            if (!result)
            {
                return;
            }
        }


        #endregion

        #region 外部XAML触发事件

        private void UpdataSelectResetColorBtn()
        {
            int result = 0;
            if (UpdataSelectResetColor(ResetColorOne))
            {
                result = 1;
            }
            else if (UpdataSelectResetColor(ResetColorTwo))
            {
                result = 2;
            }
            else if (UpdataSelectResetColor(ResetColorThree))
            {
                result = 3;
            }
            else if (UpdataSelectResetColor(ResetColorForth))
            {
                result = 4;
            }

            SelectResetColorBtnHandler?.Invoke(null, result);
        }

        private bool UpdataSelectResetColor(ResetColor reset)
        {
            if (reset.FillColor.Color == FillColor &&
                reset.FontColor.Color == ContentColor &&
                reset.BorderColor.Color == BorderColor
                )
            {
                return true;
            }

            return false;
        }
        #endregion

        #region Navegation
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
            radioButtonArgs = null;
            isCreateWidget = false;
            IsCurrentWidget = false;
            PDFViewer.AnnotEditHandler -= PDFViewer_AnnotEditHandler;
        }

        private void PDFViewer_AnnotEditHandler(object sender, List<AnnotEditEvent> e)
        {
            if (e != null && e.Count > 0)
            {

                var widgeArgs = e[e.Count - 1].EditAnnotArgs as WidgetArgs;
                if (widgeArgs != null)
                {
                    AnnotEditEvent editEvent = e[e.Count - 1];
                    if (editEvent.EditAction == ActionType.Modify)
                    {
                        SetSizeNoUpdateValue(widgeArgs.Width, widgeArgs.Height);
                    }
                }
            }
        }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            navigationContext.Parameters.TryGetValue<CPDFViewer>(ParameterNames.PDFViewer, out PDFViewer);
            navigationContext.Parameters.TryGetValue<UpdateAttributeHelper>(ParameterNames.AnnotEvent, out AttribEvent);
            navigationContext.Parameters.TryGetValue<WidgetRadioButtonArgs>("WidgetArgs", out radioButtonArgs);
            PDFViewer.AnnotEditHandler -= PDFViewer_AnnotEditHandler;
            PDFViewer.AnnotEditHandler += PDFViewer_AnnotEditHandler;

            GetWidgeText();
            UpdataSelectResetColorBtn();
        }

        private void GetWidgeText()
        {

            if (radioButtonArgs == null)
            {
                PDFViewer.SetMouseMode(MouseModes.FormEditTool);
                radioButtonArgs = new WidgetRadioButtonArgs();
                radioButtonArgs.BgColor =  Colors.Transparent;
                radioButtonArgs.FontColor = Colors.Black;
                radioButtonArgs.LineColor = Colors.Black;
                radioButtonArgs.LineWidth = 2;
                radioButtonArgs.Width = 18;
                radioButtonArgs.Height = 18;
                radioButtonArgs.RadioMemberName = "Option1";
                PDFViewer.SetToolParam(radioButtonArgs);
                isCreateWidget = true;
            }
            else
            {
                PDFViewer.SetToolParam(new AnnotHandlerEventArgs());
                isCreateWidget = false;
            }

            GetProperty();

            IsCurrentWidget = true;
        }


        private void GetProperty()
        {
            if (radioButtonArgs != null)
            {
                IsLocked = radioButtonArgs.Locked;
                FieldName = radioButtonArgs.FieldName;
                ToolTipStr = radioButtonArgs.Tooltip;
                IsReadOnly = radioButtonArgs.ReadOnly;
                IsRequiredField = radioButtonArgs.IsRequired;

                FillColor = radioButtonArgs.BgColor;
                ContentColor = radioButtonArgs.FontColor;
                BorderColor = radioButtonArgs.LineColor;
                BorderThiness = radioButtonArgs.LineWidth;
                BorderStyle = radioButtonArgs.BorderStyle;
                RadioMemberName = radioButtonArgs.RadioMemberName;
                //避免BorderStyle跟上一个值相同,而没触发更改IsSolid属性
                if (BorderStyle == C_BORDER_STYLE.BS_SOLID)
                    IsSolid = true;
                else
                    IsSolid = false;

                IsDefaultRadioBox = radioButtonArgs.IsChecked;

                if (isCreateWidget == false)
                {
                    HeightSize = radioButtonArgs.Height;
                    WidthSize = radioButtonArgs.Width;
                }
            }
        }

        #endregion
    }
}