using GeekDesk.Constant;
using GeekDesk.Interface;
using GeekDesk.Util;
using GeekDesk.ViewModel;
using HandyControl.Controls;
using Quartz;
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.Shapes;
namespace GeekDesk.Control.Windows
{
    /// 
    /// BacklogInfoWindow.xaml 的交互逻辑
    /// 
    public partial class ToDoInfoWindow : IWindowCommon
    {
        private static int windowType = -1;
        private static readonly int NEW_TODO = 1;
        private static readonly int DETAIL_TODO = 2;
        private AppData appData = MainWindow.appData;
        //private ToDoInfo info;
        private ToDoInfoWindow()
        {
            InitializeComponent();
            this.Topmost = true;
            DateTime time = DateTime.Now.AddMinutes(10);
            ExeTime.SelectedDateTime = time;
            SetTimePanel.Visibility = Visibility.Visible;
            this.DataContext = new ToDoInfo {
                ExeTime = time.ToString("yyyy-MM-dd HH:mm:ss")
            };
        }
        private ToDoInfoWindow(ToDoInfo info)
        {
            InitializeComponent();
            this.Topmost = true;
            this.DataContext = info;
            SetTimePanel.Visibility = Visibility.Visible;
            //Title.Text = info.Title;
            //Msg.Text = info.Msg;
            //ExeTime.Text = info.ExeTime;
            //DoneTime.Text = info.DoneTime;
            //this.info = info;
        }
        /// 
        /// 点击关闭按钮
        /// 
        /// 
        /// 
        private void Close_Button_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        /// 
        /// 移动窗口
        /// 
        /// 
        /// 
        private void DragMove(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                DragMove();
            }
        }
        /// 
        /// 保存待办
        /// 
        /// 
        /// 
        private void Save_Button_Click(object sender, RoutedEventArgs e)
        {
            DateTime dt;
            string execTime;
            TodoTaskExecType execType;
            if (Title.Text.Trim() == "")
            {
                Growl.Warning("任务标题不能为空!");
                return;
            } else
            {
                if (SetTimePanel.Visibility == Visibility.Visible)
                {
                    execType = TodoTaskExecType.SET_TIME;
                    if (ExeTime.Text.Trim() == "")
                    {
                        Growl.Warning("执行时间不能为空!");
                        return;
                    }
                    try
                    {
                        dt = Convert.ToDateTime(ExeTime.Text);
                    }
                    catch (Exception)
                    {
                        Growl.Warning("请输入正确的时间!");
                        return;
                    }
                    execTime = ExeTime.Text;
                } else {
                    execType = TodoTaskExecType.CRON;
                    if (Cron.Text.Trim() == "")
                    {
                        Growl.Warning("Cron表达式不能为空!");
                        return;
                    }
                    try
                    {
                        bool isValid = CronExpression.IsValidExpression(Cron.Text);
                        if (!isValid) throw new Exception();
                    } catch (Exception)
                    {
                        Growl.Warning("请输入正确的Cron表达式!");
                        return;
                    }
                    CronExpression exp = new CronExpression(Cron.Text);
                    DateTime dd = DateTime.Now;
                    DateTimeOffset ddo = DateTime.SpecifyKind(dd, DateTimeKind.Local);
                    ddo = (DateTimeOffset)exp.GetNextValidTimeAfter(ddo);
                    execTime = ddo.LocalDateTime.ToString("yyyy-MM-dd HH:mm:ss");
                }
            }
            dt = Convert.ToDateTime(execTime);
            ToDoInfo info = new ToDoInfo
            {
                Title = Title.Text,
                Msg = Msg.Text,
                ExeTime = execTime,
                ExecType = execType,
                Cron = Cron.Text
            };
            if (windowType != NEW_TODO)
            {
                appData.HiToDoList.Remove(this.DataContext as ToDoInfo);
            } 
            appData.ToDoList.Add(info);
            DateTime dtNow = DateTime.Now;
            TimeSpan ts = dt.Subtract(dtNow);
            int minutes = (int)Math.Ceiling(ts.TotalMinutes);
            if (minutes < 0)
            {
                minutes = 0;
            }
            if (minutes > 60)
            {
                int m = minutes % 60;
                int h = minutes / 60;
                Growl.SuccessGlobal("设置待办任务成功, 系统将在 " + h + " 小时零 " + m + " 分钟后提醒您!");
            } else
            {
                Growl.SuccessGlobal("设置待办任务成功, 系统将在 " + minutes + " 分钟后提醒您!");
            }
            CommonCode.SaveAppData(MainWindow.appData);
            this.Close();
        }
        private static System.Windows.Window window = null;
        public static void ShowNone()
        {
            if (window == null || !window.Activate())
            {
                window = new ToDoInfoWindow();
                window.Show();
            }
            windowType = NEW_TODO;
            window.Visibility = Visibility.Visible;
        }
        public static void ShowOrHide()
        {
            if (window == null || !window.Activate())
            {
                window = new ToDoInfoWindow();
                window.Show();
            } else
            {
                window.Close();
            }
        }
        public static System.Windows.Window GetThis()
        {
            if (window == null || !window.Activate())
            {
                window = new ToDoInfoWindow();
                window.Show();
                Keyboard.Focus(window);
            }
            window.Visibility = Visibility.Collapsed;
            windowType = NEW_TODO;
            return window;
        }
        private static System.Windows.Window window2 = null;
        public static void ShowDetail(ToDoInfo info)
        {
            if (window2 == null || !window2.Activate())
            {
                window2 = new ToDoInfoWindow(info);
            }
            windowType = DETAIL_TODO;
            window2.Show();
            Keyboard.Focus(window2);
        }
        private void ExecType_Checked(object sender, RoutedEventArgs e)
        {
            TodoTaskExecType tag = (TodoTaskExecType)Convert.ToInt32((sender as RadioButton).Tag.ToString());
            switch (tag)
            {
                case TodoTaskExecType.SET_TIME:
                    SetTimePanel.Visibility = Visibility.Visible;
                    CronPanel.Visibility = Visibility.Collapsed;
                    break;
                default:
                    CronPanel.Visibility = Visibility.Visible;
                    SetTimePanel.Visibility = Visibility.Collapsed;
                    break;
            }
        }
        public void OnKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Escape)
            {
                this.Close();
            }
        }
    }
}