using System;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using Ionic.Zip;
using System.Runtime.InteropServices;

namespace winform1
{
    public partial class Form1 : Form
    {
        private Point m_mousePos;
        private bool m_isMouseDown;
        //要下载的文件的url
        private const string m_url = "https://smallgame.download.lkgame.com/game_space/sfish/57/qgame_test/QQGameUnityDemo.zip";
        private const long m_totalSize = 21388019;
        private const string m_md5 = "44BB65977FBF90062E8A3F5521D84A11";

        //下载到本地的文件名
        private const string m_saveFile = "./qgame_unity_demo.zip";
        //解压目录
        private const string m_unzipFile = "./qgame_unity_demo";
        private const string m_exePath = "./qgame_unity_demo/QQGameUnityDemo/QQGameDemo.exe";

        public Form1()
        {
            InitializeComponent();

            InitUi();

            if (!TryOpenUnityDemoExe())
            {
                StartDownload();
            }
        }

        private void InitUi()
        {
            //隐藏标题栏
            this.FormBorderStyle = FormBorderStyle.None;

            //背景图
            pictureBg.SizeMode = PictureBoxSizeMode.StretchImage;
            //窗口移动控制
            pictureBg.MouseDown += OnMouseDown;
            pictureBg.MouseUp += OnMouseUp;
            pictureBg.MouseMove += OnMouseMove;
            progressBar.MouseDown += OnMouseDown;
            progressBar.MouseUp += OnMouseUp;
            progressBar.MouseMove += OnMouseMove;

            //提示语
            tipsLbl.Parent = pictureBg;
            processLbl.Parent = pictureBg;
            processLbl.Text = "0%";

            //进度条
            progressBar.Minimum = 0;
        }

        private bool TryOpenUnityDemoExe()
        {

            if (File.Exists(m_saveFile) && DownloadThread.GetMD5FromFile(m_saveFile) != m_md5)
            {
                return false;
            }

            if (File.Exists(m_exePath))
            {
                WinExec(m_exePath, 1);
                System.Environment.Exit(0);
                return true;
            }
            return false;
        }

        #region 隐藏标题栏后支持移动窗口
        /// <summary>
        /// 鼠标按下，开启移动
        /// </summary>
        /// <param name="e"></param>
        protected void OnMouseDown(object sender, MouseEventArgs e)
        {
            m_mousePos = Cursor.Position;
            m_isMouseDown = true;
        }

        /// <summary>
        /// 鼠标抬起，关闭移动
        /// </summary>
        /// <param name="e"></param>
        protected void OnMouseUp(object sender, MouseEventArgs e)
        {
            m_isMouseDown = false;
            this.Focus();
        }

        /// <summary>
        /// 移动窗口
        /// </summary>
        /// <param name="e"></param>
        private void OnMouseMove(object sender, MouseEventArgs e)
        {
            if (m_isMouseDown)
            {
                Point tempPos = Cursor.Position;
                this.Location = new Point(Location.X + (tempPos.X - m_mousePos.X), Location.Y + (tempPos.Y - m_mousePos.Y));
                m_mousePos = Cursor.Position;
            }
        }
        #endregion

        #region 更新进度条
        /// <summary>
        /// 被委托调用,专门设置进度条最大值
        /// </summary>
        /// <param name="maxValue"></param>
        public void UpdateProgressMaxValue(int maxValue)
        {
            progressBar.Maximum = maxValue;
            UpdateTipsLbl("正在下载，请耐心等待");
        }

        public void UpdateTipsLbl(string txt)
        {
            tipsLbl.Text = txt;
        }

        /// <summary>
        /// 被委托调用,专门设置进度条当前值
        /// </summary>
        /// <param name="nowValue"></param>
        private void UpdateProgressCurValue(int curValue)
        {
            progressBar.Value = curValue;
            string nowValueStr = string.Format("{0:F}", (float)curValue / progressBar.Maximum * 100);
            processLbl.Text = nowValueStr + "%";
        }
        #endregion

        private void StartDownload()
        {
            DownloadThread method = new DownloadThread();
            //先订阅一下事件
            method.eventDownloadStart += OnEventDownloadStart;
            method.eventDownloadIng += OnEventDownloadIng;
            method.eventCheckingMd5 += OnEventCheckMd5;
            method.eventDownloadDone += OnEventDownloadDone;

            //开启一个线程进行下载
            Task task = new Task(() => { method.RunMethod(m_url, m_saveFile, m_totalSize, m_md5); });
            task.Start();
        }

        private void UnZipFile(string file)
        {
            using (ZipFile zip = new ZipFile(file))
            {
                zip.ExtractAll(m_unzipFile);
            }
        }


        /// 线程开始事件,设置进度条最大值
        /// 但是不能直接操作进度条,需要一个委托来替我完成
        void OnEventDownloadStart(long totalSize)
        {
            Invoke(new Action<int>(UpdateProgressMaxValue), (int)totalSize);
        }

        /// 线程执行中的事件,设置进度条当前进度
        /// 但是不能直接操作进度条,需要一个委托来替我完成
        void OnEventDownloadIng(long curDownloadSize)
        {
            Invoke(new Action<int>(UpdateProgressCurValue), (int)curDownloadSize);
        }

        void OnEventCheckMd5()
        {
            Invoke(new Action<string>(UpdateTipsLbl), "正在校验文件，请稍等");
        }

        /// <summary>
        /// 线程完成事件
        /// </summary>
        void OnEventDownloadDone()
        {
            //解压文件
            UnZipFile(m_saveFile);
            //尝试打开下载的exe
            TryOpenUnityDemoExe();
        }

        [DllImport("kernel32.dll")]
        public static extern int WinExec(string exeName, int operType);
    }
}
