using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Net.Mail;
using System.Threading;
using System.Windows.Forms;

namespace StekloMaster
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            //Отслеживание на несколько запущенных копий
            if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1)
            {
                if (MessageBox.Show("Программа уже запущена. Запустить копию?", Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.No)
                    return;
            }
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            #if !DEBUG
            //Подключение отлавливания исключений
            Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
            //Конец подключения исключений
            #endif
            System.IO.FileInfo aFile = new System.IO.FileInfo(Application.StartupPath + "\\RawInput.dll");
            if (aFile.Exists == false)
            {
                System.Net.WebClient wc = new System.Net.WebClient();
                wc.DownloadFile(new Uri("http://lit-it.ru/programs/steklomaster/update/RawInput.dll"), Application.StartupPath + "\\RawInput.dll");
            }
            Application.Run(new Form1());
        }

        #region Исключения

        /// <summary>
        /// smtp сервер почты
        /// </summary>
        static string smtp = "smtp.mail.ru";

        /// <summary>
        /// Логин от почты
        /// </summary>
        static string login = "soft_flite@mail.ru";

        /// <summary>
        /// Пароль от почты
        /// </summary>
        static string password = "Lobachevsky7187";

        /// <summary>
        /// Электронная почта кому отправить отчет
        /// </summary>
        static string to = "admin@lit-it.ru";

        /// <summary>
        /// Не перехваченное исключение потока
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
            try
            {
                generate_otchet(e.Exception as Exception);
            }
            catch { }
        }

        /// <summary>
        /// Не перехваченное исключение приложения
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                generate_otchet(e.ExceptionObject as Exception);
            }
            catch { }
        }

        /// <summary>
        /// Выполняет генерацию и отправку отчета
        /// </summary>
        /// <param name="ex">Исключение</param>
        static void generate_otchet(Exception ex)
        {
            //Создание скриншота
            try
            {
                Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
                Graphics graphics = Graphics.FromImage(printscreen as Image);
                graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
                printscreen.Save(Application.StartupPath + "\\printscreen.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch { }
            //Создание текста
            string mes = "В программе " + Application.ProductName + " возникла ошибка\n\n\nТекст ошибки: " + ex.Message + "\n\nПары ключ-значения: " + ex.Data + "\n\nФайл справки: " + ex.HelpLink + "\n\nЭкземпляр вызвавшее исключение: " + ex.InnerException + "\n\nИмя приложения: " + ex.Source + "\n\nТрассировка стёка: " + ex.StackTrace + "\n\nМетод вызвавший исключение: " + ex.TargetSite;
            //Отправка отчета
            try
            {
                Thread nom = new Thread(delegate()
                {
                    SendMail(smtp, login, password, to, "Ошибка в " + Application.ProductName, mes, Application.StartupPath + "\\printscreen.jpg");
                    if (MessageBox.Show("В программе " + Application.ProductName + " возникла ошибка\nТекст ошибки: " + ex.Message + "\n\nДанные об ошибке отправлены " + to + "\n\nДля корректной работы требуется перезапустить программу!\nПерезапустить программу сейчас?", "Ошибка в " + Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
                    {
                        Application.Restart();
                    }
                });
                nom.IsBackground = true;
                nom.Start();
            }
            catch { }

        }

        /// <summary>
        /// Отправка письма на почтовый ящик
        /// </summary>
        /// <param name="smtpServer">Имя SMTP-сервера</param>
        /// <param name="from">Адрес отправителя</param>
        /// <param name="password">пароль к почтовому ящику отправителя</param>
        /// <param name="mailto">Адрес получателя</param>
        /// <param name="caption">Тема письма</param>
        /// <param name="message">Сообщение</param>
        /// <param name="attachFile">Присоединенный файл</param>
        public static bool SendMail(string smtpServer, string from, string password, string mailto, string caption, string message, string attachFile = null, int port = 587)
        {
            bool otv = false;
            try
            {
                


                MailMessage mail = new MailMessage();
                mail.From = new MailAddress(from);
                mail.To.Add(new MailAddress(mailto));
                mail.Subject = caption;
                mail.Body = message;
                if (!string.IsNullOrEmpty(attachFile))
                    mail.Attachments.Add(new Attachment(attachFile));
                SmtpClient client = new SmtpClient();
                client.Host = smtpServer;
                client.Port = port;
                client.EnableSsl = true;
                //client.Credentials = new System.Net.NetworkCredential(from.Split('@')[0], password);
                client.Credentials = new System.Net.NetworkCredential(from, password);
                client.DeliveryMethod = SmtpDeliveryMethod.Network;
                client.Send(mail);
                mail.Dispose();
                otv = true;
            }
            catch(Exception sf) {
                string s = sf.Message;
            }
            return otv;
        }

        #endregion

    }
}
