using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StekloMaster
{
    public partial class ИЗОБРАЖЕНИЯ_добавить : Form
    {
        public ИЗОБРАЖЕНИЯ_добавить()
        {
            InitializeComponent();
        }
        public string put_to_papka = "";
        public string put_to_preview = "";

        public Image ResizeOrigImg(Image image, int nWidth, int nHeight)
        {
            int newWidth, newHeight;
            var coefH = (double)nHeight / (double)image.Height;
            var coefW = (double)nWidth / (double)image.Width;
            if (coefW >= coefH)
            {
                newHeight = (int)(image.Height * coefH);
                newWidth = (int)(image.Width * coefH);
            }
            else
            {
                newHeight = (int)(image.Height * coefW);
                newWidth = (int)(image.Width * coefW);
            }

            Image result = new Bitmap(newWidth, newHeight);
            using (var g = Graphics.FromImage(result))
            {
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;

                g.DrawImage(image, 0, 0, newWidth, newHeight);
                g.Dispose();
            }
            return result;
        }

        private void metroButton1_Click(object sender, EventArgs e)
        {
            label1.Text = "Работаем...";
            try
            {
                using (var dialog = new OpenFileDialog())
                {
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        string namefile = dialog.SafeFileName;
                        Random zs = new Random();
                        //это изображение
                        try
                        {
                            while (File.Exists(put_to_papka + "\\" + namefile + ".akv"))
                            {
                                namefile = zs.Next(0, 9).ToString() + namefile;
                            }
                            Image micro = Image.FromFile(dialog.FileName);
                            micro = ResizeOrigImg(micro, 128, 128);
                            Bitmap microro = new Bitmap(128, 128);
                            Graphics gfx = Graphics.FromImage(microro);
                            gfx.DrawImage(micro, (128-micro.Width)/2, (128 - micro.Height) / 2, micro.Width, micro.Height);
                            microro.Save(put_to_preview + "\\" + namefile + ".akv");
                            //шифруем
                            string msg = "";
                            Shifr.EncryptFile(dialog.FileName, put_to_papka + "\\" + namefile + ".akv", "qF29s4JE", out msg);

                            ИЗОБРАЖЕНИЯ_главная gs = this.Owner as ИЗОБРАЖЕНИЯ_главная;
                            gs.obnovlen_tek();
                        }
                        catch
                        {
                            //это файл
                            try
                            {
                                while (File.Exists(put_to_papka + "\\" + namefile + ".fkv"))
                                {
                                    namefile = zs.Next(0, 9).ToString() + namefile;
                                }
                                /*Image micro = Properties.Resources.download_file;
                                micro = ResizeOrigImg(micro, 128, 128);
                                micro.Save(put_to_preview + "\\" + namefile + ".akv"); - без миниатюры*/
                                //шифруем
                                string msg = "";
                                Shifr.EncryptFile(dialog.FileName, put_to_papka + "\\" + namefile + ".fkv", "qF29s4JE", out msg);

                                ИЗОБРАЖЕНИЯ_главная gs = this.Owner as ИЗОБРАЖЕНИЯ_главная;
                                gs.obnovlen_tek();
                            }
                            catch
                            {

                            }
                        }
                        label1.Text = "Импорт завершен!";
                    }
                    else
                    {
                        label1.Text = "Импорт файлов";
                    }
                }
            }
            catch(Exception eg)
            {
                label1.Text = "Импорт файлов";
                MessageBox.Show("При шифровке файла возникла ошибка!");
            }
        }

        private void metroButton5_Click(object sender, EventArgs e)
        {
            label1.Text = "Работаем...";
            using (var dialog = new FolderBrowserDialog())
            {
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    log = "";
                    label1.Text = "0";
                    Thread lod = new Thread(delegate ()
                    {
                        FileSearchFunction(dialog.SelectedPath, dialog.SelectedPath);
                        this.Invoke(new EventHandler(delegate
                        {
                            if (log != "")
                            {
                                ИЗОБРАЖЕНИЯ_лог sf = new ИЗОБРАЖЕНИЯ_лог();
                                sf.richTextBox1.Text = "Во время выполнения найдены замечания:\r\n" + log;
                                sf.Owner = this;
                                sf.Show();
                            }
                            ИЗОБРАЖЕНИЯ_главная gs = this.Owner as ИЗОБРАЖЕНИЯ_главная;
                            gs.obnovlen_tek();
                            label1.Text = "Импорт завершен!";
                        }));
                    });
                    lod.IsBackground = true;
                    lod.Start();

                    //MessageBox.Show(dialog.SelectedPath);
                }
                else
                {
                    label1.Text = "Импорт файлов";
                }
            }
        }

        string log = "";


        void shifrfile(string absolut,string namefile, string FullName)
        {
            if (namefile != "Thumbs.db")
            {
                try
                {
                    Random zs = new Random();
                    while (File.Exists(put_to_papka + absolut + "\\" + namefile + ".fkv"))
                    {
                        namefile = zs.Next(0, 9).ToString() + namefile;
                    }
                    string msg = "";
                    Shifr.EncryptFile(FullName, put_to_papka + absolut + "\\" + namefile + ".fkv", "qF29s4JE", out msg);

                    this.Invoke(new EventHandler(delegate
                    {
                        label1.Text = (Convert.ToInt32(label1.Text) + 1).ToString();
                    }));
                }
                catch
                {
                    log += "Не удалось зашифровать файл: " + namefile + "\r\n";
                }
            }
        }

        bool shifrimg(string absolut, string namefile, string FullName)
        {
            bool uspex = false;
            if (namefile == "Thumbs.db")
            {
                return true;
            }
            try
            {
                Random zs = new Random();
                while (File.Exists(put_to_papka + absolut + "\\" + namefile + ".akv"))
                {
                    namefile = zs.Next(0, 9).ToString() + namefile;
                }

                Image micro = Image.FromFile(FullName);
                micro = ResizeOrigImg(micro, 128, 128);
                Bitmap microro = new Bitmap(128, 128);
                Graphics gfx = Graphics.FromImage(microro);
                gfx.DrawImage(micro, (128 - micro.Width) / 2, (128 - micro.Height) / 2, micro.Width, micro.Height);
                microro.Save(put_to_preview + absolut + "\\" + namefile + ".akv");
                //шифруем
                string msg = "";
                Shifr.EncryptFile(FullName, put_to_papka + absolut + "\\" + namefile + ".akv", "qF29s4JE", out msg);
                this.Invoke(new EventHandler(delegate
                {
                    label1.Text = (Convert.ToInt32(label1.Text) + 1).ToString();
                }));
                uspex = true;
            }
            catch { }
            return uspex;
        }

        private void FileSearchFunction(string Dir, string koren)
        {
            System.IO.DirectoryInfo DI = new System.IO.DirectoryInfo(Dir);

            System.IO.FileInfo[] FI = DI.GetFiles();

            string absolut = Dir.Replace(koren, "");
            if (absolut != "") absolut = "\\" + absolut;

            for (int i = 0; i < FI.Length; ++i)
            {
                string namefile = FI[i].Name;
                int popitka = 1;
                if(namefile.IndexOf(".png") != -1 || namefile.IndexOf(".bmp") != -1 || namefile.IndexOf(".dib") != -1 || namefile.IndexOf(".rle") != -1 
                    || namefile.IndexOf(".emf") != -1 || namefile.IndexOf(".emz") != -1 || namefile.IndexOf(".exif") != -1 || namefile.IndexOf(".tiff") != -1
                    || namefile.IndexOf(".gif") != -1 || namefile.IndexOf(".wav") != -1 || namefile.IndexOf(".tiff") != -1 || namefile.IndexOf(".ico") != -1
                    || namefile.IndexOf(".jpg") != -1 || namefile.IndexOf(".jfif") != -1 || namefile.IndexOf(".jpe") != -1 || namefile.IndexOf(".jpeg") != -1
                    || namefile.IndexOf(".tif") != -1 || namefile.IndexOf(".wmf") != -1 || namefile.IndexOf(".wmz") != -1)
                {
                    popitka = 5;
                }
                bool otvet = false;
                for(int z = 0; z<popitka;z++)
                {
                    otvet = shifrimg(absolut, namefile, FI[i].FullName);
                    if (otvet)
                        break;
                }
                if(!otvet)
                {
                    //это файл
                    shifrfile(absolut, namefile, FI[i].FullName);
                }
            }
            System.IO.DirectoryInfo[] SubDir = DI.GetDirectories();
            for (int i = 0; i < SubDir.Length; ++i)
            {
                //создаем директорию
                try
                {
                    if (!Directory.Exists(put_to_papka + absolut + "\\" + SubDir[i].Name))
                    {
                        Directory.CreateDirectory(put_to_papka + absolut + "\\" + SubDir[i].Name);
                        if (!Directory.Exists(put_to_preview + absolut + "\\" + SubDir[i].Name))
                            Directory.CreateDirectory(put_to_preview + absolut + "\\" + SubDir[i].Name);
                    }
                    FileSearchFunction(SubDir[i].FullName, koren);
                }
                catch
                {
                    log+= "Не удалось создать папку: " + put_to_papka + absolut + "\\" + SubDir[i].Name + "\r\n";
                }
            }
           
        }
    }
}
