
using GeekDesk.Constant;
using GeekDesk.Util;
using GeekDesk.ViewModel.Temp;
using Newtonsoft.Json;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Imaging;
using static GeekDesk.Util.GlobalHotKey;

/// <summary>
/// 程序设置
/// </summary>
namespace GeekDesk.ViewModel
{

    [Serializable]
    public class AppConfig : INotifyPropertyChanged
    {
        private SortType menuSortType = SortType.CUSTOM; //菜单排序类型
        private SortType iconSortType = SortType.CUSTOM; //图表排序类型
        private double windowWidth = (double)CommonEnum.WINDOW_WIDTH;  //窗口宽度
        private double windowHeight = (double)CommonEnum.WINDOW_HEIGHT; //窗口高度
        private double menuCardWidth = (double)CommonEnum.MENU_CARD_WIDHT;//菜单栏宽度
        private int selectedMenuIndex = 0;  //上次选中菜单索引
        private bool followMouse = true;  //面板跟随鼠标 默认是
        private Visibility configIconVisible = Visibility.Visible; // 设置按钮是否显示
        private Visibility titleLogoVisible = Visibility.Visible; // 标题logo是否显示
        private AppHideType appHideType = AppHideType.START_EXE;  //面板关闭方式 (默认启动程序后)
        private bool startedShowPanel = true;  //启动时是否显示主面板  默认显示
        [field: NonSerialized]
        private BitmapImage bitmapImage; //位图
        private byte[] imageByteArr; //背景图片 byte数组
        private string bacImgName = "系统默认";
        private int cardOpacity = 10;  //默认0.1的不透明度  此处显示数值 * 100
        private int bgOpacity = 100; // 背景图片不透明度 此处显示数值 * 100
        private int pannelOpacity = 100; //主面板不透明度 此处显示数值 * 100
        private int pannelCornerRadius = 4;  //面板圆角 默认4
        [field: NonSerialized]
        private ObservableCollection<IconInfo> selectedMenuIcons;

        private string hotkeyStr = "Ctrl + Q";  //默认启动面板快捷键
        private HotkeyModifiers hotkeyModifiers = HotkeyModifiers.MOD_CONTROL; //默认启动面板快捷键
        private Key hotkey = Key.Q; //默认启动面板快捷键

        private string toDoHotkeyStr = "Ctrl + Shift + Q";  //待办任务快捷键
        private HotkeyModifiers toDoHotkeyModifiers; //待办任务快捷键
        private Key toDoHotkey = Key.Q; //待办任务快捷键


        private string colorPickerHotkeyStr = ""; //拾色器快捷键
        private HotkeyModifiers colorPickerHotkeyModifiers; //拾色器快捷键
        private Key colorPickerHotkey; //拾色器快捷键

        private string customIconUrl; //自定义图标url
        private string customIconJsonUrl;  //自定义图标json信息url

        private bool blurEffect = false; //毛玻璃效果 默认否
        private double blurValue;

        private UpdateType updateType = UpdateType.Gitee; //更新源 默认gitee源

        private bool selfStartUp = true; //开机自启动设置
        private bool selfStartUped = false;  //是否已设置
        private bool pmModel = false; //性能模式
        private string textColor = "#000000"; //字体颜色
        private double imgPanelWidth = (double)CommonEnum.IMAGE_PANEL_WIDTH;
        private double imgPanelHeight = (double)CommonEnum.IMAGE_PANEL_HEIGHT;
        private bool marginHide = false; //贴边隐藏
        private bool appAnimation = false; //主窗口动画效果
        private int imageWidth = (int)CommonEnum.IMAGE_WIDTH; //图片宽度
        private int imageHeight = (int)CommonEnum.IMAGE_HEIGHT; //图片高度

        private bool mouseMiddleShow = false;  //鼠标中键呼出 默认不启用

        private bool showBarIcon = true; //显示托盘图标  默认显示

        private bool doubleOpen = false; //双击打开项目  默认关闭

        private bool hoverMenu = false; //悬停切换菜单  默认关闭

        private BGStyle bgStyle = BGStyle.ImgBac; //背景风格

        private GradientBGParam gradientBGParam = null; //渐变背景参数

        private bool? enableAppHotKey = true;  //可能为null 开启热键
        private bool? enableTodoHotKey = true; //可能为null 开启待办热键

        private bool enableColorPickerHotKey;  //新增 默认为false 不需要考虑null值

        private SearchType searchType;

        private string sysBakTime;  //系统自动备份时间

        private string menuPassword; //锁菜单密码

        private string passwordHint; //密码提示

        private bool? isShow;

        private bool itemSpradeAnimation; //列表展开动画

        private bool? secondsWindow; //秒数窗口 默认打开

        private bool? enableEveryThing;

        private bool? alwaysTopmost;


        public bool? AlwaysTopmost
        {
            get
            {
                if (alwaysTopmost == null) alwaysTopmost = false;
                return alwaysTopmost;
            }
            set
            {
                alwaysTopmost = value;
                OnPropertyChanged("AlwaysTopmost");
            }
        }

        public bool? EnableEveryThing
        {
            get
            {
                if (enableEveryThing == null) enableEveryThing = false;
                return enableEveryThing;
            }
            set
            {
                enableEveryThing = value;
                OnPropertyChanged("EnableEveryThing");
            }
        }

        #region GetSet

        public bool? SecondsWindow
        {
            get
            {
                if (secondsWindow == null) secondsWindow = true;
                return secondsWindow;
            }
            set
            {
                secondsWindow = value;
                OnPropertyChanged("SecondsWindow");
            }
        }

        public bool ItemSpradeAnimation
        {
            get
            {
                return itemSpradeAnimation;
            }
            set
            {
                itemSpradeAnimation = value;
                OnPropertyChanged("ItemSpradeAnimation");
            }
        }

        public bool? IsShow
        {
            get
            {
                return isShow;
            }
            set
            {
                isShow = value;
                OnPropertyChanged("IsShow");
            }
        }

        public string PasswordHint
        {
            get
            {
                return passwordHint;
            }
            set
            {
                passwordHint = value;
                OnPropertyChanged("PasswordHint");
            }
        }
        public string MenuPassword
        {
            get
            {
                return menuPassword;
            }
            set
            {
                menuPassword = value;
                OnPropertyChanged("MenuPassword");
            }
        }

        public string SysBakTime
        {
            get
            {
                return sysBakTime;
            }
            set
            {
                sysBakTime = value;
            }
        }

        public SearchType SearchType
        {
            get
            {
                return searchType;
            }
            set
            {
                searchType = value;
                OnPropertyChanged("SearchType");
            }
        }

        public bool EnableColorPickerHotKey
        {
            get
            {
                return enableColorPickerHotKey;
            }
            set
            {
                enableColorPickerHotKey = value;
                OnPropertyChanged("EnableColorPickerHotKey");
            }
        }

        public bool? EnableAppHotKey
        {
            get
            {
                if (enableAppHotKey == null) enableAppHotKey = true;
                return enableAppHotKey;
            }
            set
            {
                enableAppHotKey = value;
                OnPropertyChanged("EnableAppHotKey");
            }
        }

        public bool? EnableTodoHotKey
        {
            get
            {
                if (enableTodoHotKey == null) enableTodoHotKey = true;
                return enableTodoHotKey;
            }
            set
            {
                enableTodoHotKey = value;
                OnPropertyChanged("EnableTodoHotKey");
            }
        }

        public Visibility TitleLogoVisible
        {
            get
            {
                return titleLogoVisible;
            }
            set
            {
                titleLogoVisible = value;
                OnPropertyChanged("TitleLogoVisible");
            }
        }

        public GradientBGParam GradientBGParam
        {
            get
            {
                if (gradientBGParam == null)
                {
                    gradientBGParam = GradientBGParamList.GradientBGParams[0];
                }
                return gradientBGParam;
            }
            set
            {
                gradientBGParam = value;
                OnPropertyChanged("GradientBGParam");
            }
        }

        public BGStyle BGStyle
        {
            get
            {
                if (bgStyle == 0)
                {
                    bgStyle = (BGStyle)1;
                }
                return bgStyle;
            }
            set
            {
                bgStyle = value;
                OnPropertyChanged("BGStyle");
            }
        }

        public bool HoverMenu
        {
            get
            {
                return hoverMenu;
            }
            set
            {
                hoverMenu = value;
                OnPropertyChanged("HoverMenu");
            }
        }

        public bool DoubleOpen
        {
            get
            {
                return doubleOpen;
            }
            set
            {
                doubleOpen = value;
                OnPropertyChanged("DoubleOpen");
            }
        }

        public bool ShowBarIcon
        {
            get
            {
                return showBarIcon;
            }
            set
            {
                showBarIcon = value;
                OnPropertyChanged("ShowBarIcon");
            }
        }

        public bool MouseMiddleShow
        {
            get
            {
                return mouseMiddleShow;
            }
            set
            {
                mouseMiddleShow = value;
                OnPropertyChanged("MouseMiddleShow");
            }
        }

        public int ImageWidth
        {
            get
            {
                // 为了兼容旧版 暂时使用默认
                if (imageWidth == 0)
                {
                    return (int)CommonEnum.IMAGE_WIDTH;
                }
                else
                {
                    return imageWidth;
                }

            }
            set
            {
                imageWidth = value;
                //同时设置高度
                ImageHeight = value;


                //计算 容器宽度因子
                double i = ((double)imageWidth - (double)CommonEnum.IMAGE_WIDTH) / 5d;
                double s = 2.44;
                i *= 2d;
                while (i > 1)
                {
                    i /= 10d;
                }

                if (i > 0d)
                {
                    s -= i;
                }
                if (s < 2.2)
                {
                    s = 2.2;
                }
                //设置容器宽度
                ImgPanelWidth = (int)(ImageWidth * s);

                OnPropertyChanged("ImageWidth");
            }
        }

        public int ImageHeight
        {
            get
            {
                //都使用宽度来确定大小
                // 为了兼容旧版 暂时使用默认
                if (imageHeight == 0)
                {
                    return (int)CommonEnum.IMAGE_HEIGHT;
                }
                else
                {
                    return imageHeight;
                }
            }
            set
            {
                imageHeight = value;

                //计算容器高度因子
                double i = ((double)imageHeight - (double)CommonEnum.IMAGE_HEIGHT) / 5d;
                while (i > 1)
                {
                    i /= 10d;
                }
                double s = 2.00;
                if (i > 0d)
                {
                    s -= i;
                }
                if (s < 1.5) s = 1.5;

                //设置容器高度
                ImgPanelHeight = ImageHeight * s;
                OnPropertyChanged("ImageHeight");
            }
        }

        public bool AppAnimation
        {
            get
            {
                return appAnimation;
            }
            set
            {
                appAnimation = value;
                OnPropertyChanged("AppAnimation");
            }
        }

        public bool MarginHide
        {
            get
            {
                return marginHide;
            }
            set
            {
                marginHide = value;
                OnPropertyChanged("MarginHide");
            }
        }

        public double ImgPanelWidth
        {
            get
            {
                if (imgPanelWidth == 0d) return (double)CommonEnum.IMAGE_PANEL_WIDTH;
                return imgPanelWidth;
            }
            set
            {
                imgPanelWidth = value;
                OnPropertyChanged("ImgPanelWidth");
            }
        }

        public double ImgPanelHeight
        {
            get
            {
                if (imgPanelHeight == 0d) return (double)CommonEnum.IMAGE_PANEL_HEIGHT;
                return imgPanelHeight;
            }
            set
            {
                imgPanelHeight = value;
                OnPropertyChanged("ImgPanelHeight");
            }
        }

        public string TextColor
        {
            get
            {
                if (textColor == null) return "#000000";
                return textColor;
            }
            set
            {
                textColor = value;
                OnPropertyChanged("TextColor");
            }
        }

        public bool PMModel
        {
            get
            {
                return pmModel;
            }
            set
            {
                pmModel = value;
                OnPropertyChanged("PMModel");
            }
        }

        public bool SelfStartUped
        {
            get
            {
                return selfStartUped;
            }
            set
            {
                selfStartUped = value;
                OnPropertyChanged("SelfStartUped");
            }
        }

        public bool SelfStartUp
        {
            get
            {
                return selfStartUp;
            }
            set
            {
                selfStartUp = value;
                selfStartUped = true;
                OnPropertyChanged("SelfStartUp");
            }
        }

        public Key ColorPickerHotkey
        {
            get
            {
                return colorPickerHotkey;
            }
            set
            {
                colorPickerHotkey = value;
                OnPropertyChanged("ColorPickerHotkey");
            }
        }


        public HotkeyModifiers ColorPickerHotkeyModifiers
        {
            get
            {
                return colorPickerHotkeyModifiers;
            }
            set
            {
                colorPickerHotkeyModifiers = value;
                OnPropertyChanged("ColorPickerHotkeyModifiers");
            }
        }

        public string ColorPickerHotkeyStr
        {
            get
            {
                return colorPickerHotkeyStr;
            }
            set
            {
                colorPickerHotkeyStr = value;
                OnPropertyChanged("ColorPickerHotkeyStr");
            }
        }


        public Key ToDoHotkey
        {
            get
            {
                //兼容老版本
                if (toDoHotkey == Key.None)
                {
                    toDoHotkey = Key.E;
                }
                return toDoHotkey;
            }
            set
            {
                toDoHotkey = value;
                OnPropertyChanged("ToDoHotkey");
            }
        }


        public HotkeyModifiers ToDoHotkeyModifiers
        {
            get
            {
                if (toDoHotkeyModifiers == 0)
                {
                    toDoHotkeyModifiers = HotkeyModifiers.MOD_CONTROL | HotkeyModifiers.MOD_SHIFT;
                }
                return toDoHotkeyModifiers;
            }
            set
            {
                toDoHotkeyModifiers = value;
                OnPropertyChanged("ToDoHotkeyModifiers");
            }
        }

        public string ToDoHotkeyStr
        {
            get
            {
                //兼容老版本
                if (toDoHotkeyStr == null)
                {
                    toDoHotkeyStr = "Ctrl + Shift + Q";
                }
                return toDoHotkeyStr;
            }
            set
            {
                toDoHotkeyStr = value;
                OnPropertyChanged("ToDoHotkeyStr");
            }
        }

        public UpdateType UpdateType
        {
            get
            {
                return updateType;
            }
            set
            {
                updateType = value;
                OnPropertyChanged("UpdateType");
            }
        }

        public double BlurValue
        {
            get
            {
                return blurValue;
            }
            set
            {
                blurValue = value;
                OnPropertyChanged("BlurValue");
            }
        }

        public bool BlurEffect
        {
            get
            {
                return blurEffect;
            }
            set
            {
                blurEffect = value;
                if (blurEffect)
                {
                    BlurValue = 100;
                }
                else
                {
                    BlurValue = 0;
                }
                OnPropertyChanged("BlurEffect");
            }
        }
        public string CustomIconUrl
        {
            get
            {
                return customIconUrl;
            }
            set
            {
                customIconUrl = value;
                OnPropertyChanged("CustomIconUrl");
            }
        }
        public string CustomIconJsonUrl
        {
            get
            {
                return customIconJsonUrl;
            }
            set
            {
                customIconJsonUrl = value;
                OnPropertyChanged("CustomIconJsonUrl");
            }
        }
        public Key Hotkey
        {
            get
            {
                return hotkey;
            }
            set
            {
                hotkey = value;
                OnPropertyChanged("Hotkey");
            }
        }
        public string HotkeyStr
        {
            get
            {
                return hotkeyStr;
            }
            set
            {
                hotkeyStr = value;
                OnPropertyChanged("HotkeyStr");
            }
        }
        public HotkeyModifiers HotkeyModifiers
        {
            get
            {
                if (hotkeyModifiers == 0)
                {
                    hotkeyModifiers = HotkeyModifiers.MOD_CONTROL;
                }
                return hotkeyModifiers;
            }
            set
            {
                hotkeyModifiers = value;
                OnPropertyChanged("HotkeyModifiers");
            }
        }

        public ObservableCollection<IconInfo> SelectedMenuIcons
        {
            get
            {
                return selectedMenuIcons;
            }
            set
            {
                selectedMenuIcons = value;
                OnPropertyChanged("SelectedMenuIcons");
            }
        }

        public int PannelCornerRadius
        {
            get
            {
                return pannelCornerRadius;
            }
            set
            {
                pannelCornerRadius = value;
                OnPropertyChanged("pannelCornerRadius");
            }
        }

        public int PannelOpacity
        {
            get
            {
                return pannelOpacity;
            }
            set
            {
                pannelOpacity = value;
                OnPropertyChanged("PannelOpacity");
            }
        }
        public int BgOpacity
        {
            get
            {
                return bgOpacity;
            }
            set
            {
                bgOpacity = value;
                OnPropertyChanged("BgOpacity");
            }
        }

        public int CardOpacity
        {
            get
            {
                return cardOpacity;
            }
            set
            {
                cardOpacity = value;
                OnPropertyChanged("CardOpacity");
            }
        }

        public string BacImgName
        {
            get
            {
                return bacImgName;
            }
            set
            {
                bacImgName = value;
                OnPropertyChanged("BacImgName");
            }
        }

        public byte[] ImageByteArr
        {
            get
            {
                return imageByteArr;
            }
            set
            {
                imageByteArr = value;
                OnPropertyChanged("ImageByteArr");
            }
        }


        public BitmapImage BitmapImage
        {
            get
            {
                if (imageByteArr == null || imageByteArr.Length == 0)
                {
                    bacImgName = "系统默认";
                    //Image image = ImageUtil.ByteArrayToImage(Convert.FromBase64String(Constants.DEFAULT_BAC_IMAGE_BASE64));
                    return ImageUtil.ByteArrToImage(Convert.FromBase64String(Constants.DEFAULT_BAC_IMAGE_BASE64));
                }
                else
                {
                    return ImageUtil.ByteArrToImage(ImageByteArr);
                }
            }
            set
            {
                bitmapImage = value;
                imageByteArr = ImageUtil.BitmapImageToByte(bitmapImage);
                OnPropertyChanged("BitmapImage");
            }
        }


        public bool StartedShowPanel
        {
            get
            {
                return startedShowPanel;
            }
            set
            {
                startedShowPanel = value;
                OnPropertyChanged("StartedShowPanel");
            }
        }

        public AppHideType AppHideType
        {
            get
            {
                return appHideType;
            }
            set
            {
                appHideType = value;
                OnPropertyChanged("AppHideType");
            }
        }

        public Visibility ConfigIconVisible
        {
            get
            {
                return configIconVisible;
            }
            set
            {
                configIconVisible = value;
                OnPropertyChanged("ConfigIconVisible");
            }
        }


        public bool FollowMouse
        {
            get
            {
                return followMouse;
            }
            set
            {
                followMouse = value;
                OnPropertyChanged("FollowMouse");
            }
        }

        public int SelectedMenuIndex
        {
            get
            {
                return selectedMenuIndex;
            }
            set
            {
                selectedMenuIndex = value;
                OnPropertyChanged("SelectedMenuIndex");
            }
        }

        public SortType MenuSortType
        {
            get
            {
                return menuSortType;
            }
            set
            {
                menuSortType = value;
                OnPropertyChanged("MenuSortType");
            }
        }

        public SortType IconSortType
        {
            get
            {
                return iconSortType;
            }
            set
            {
                iconSortType = value;
                OnPropertyChanged("IconSortType");
            }
        }

        public double WindowWidth
        {
            get
            {
                return windowWidth;
            }
            set
            {
                windowWidth = value;
                OnPropertyChanged("WindowWidth");
            }
        }

        public double WindowHeight
        {
            get
            {
                return windowHeight;
            }
            set
            {
                windowHeight = value;
                OnPropertyChanged("WindowHeight");
            }
        }

        public double MenuCardWidth
        {
            get
            {
                return menuCardWidth;
            }
            set
            {
                menuCardWidth = value;
                OnPropertyChanged("MenuCardWidth");
            }
        }

        [field: NonSerializedAttribute()]
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            CommonCode.SaveAppData(MainWindow.appData, Constants.DATA_FILE_PATH);
        }

        #endregion

        public override String ToString()
        {
            return JsonConvert.SerializeObject(this);
        }
    }
}
