using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Security.Cryptography;
using System.Windows.Forms;
using MaterialSkin;
using MaterialSkin.Controls;

namespace M5PDF
{
    public partial class Form1 : MaterialForm
    {
        private readonly MaterialSkinManager materialSkinManager;
        private List<ClipboardItem> clipboardHistory = new List<ClipboardItem>();
        private ImageList imageList1;
        private NotifyIcon trayIcon;  // أيقونة البرنامج في منطقة الإعلام (System Tray)
        private ContextMenuStrip trayMenu;  // قائمة السياق عند الضغط بزر الماوس الأيمن
        private ToolTip copyToolTip;  // كائن ToolTip لإظهار الرسالة

        public Form1()
        {
            InitializeComponent();

            // إعداد MaterialSkinManager
            materialSkinManager = MaterialSkinManager.Instance;
            materialSkinManager.AddFormToManage(this);

            // تخصيص الثيم والألوان
            materialSkinManager.Theme = MaterialSkinManager.Themes.LIGHT;
            materialSkinManager.ColorScheme = new ColorScheme(
                Primary.Blue600,
                Primary.Blue700,
                Primary.Blue200,
                Accent.Pink200,
                TextShade.WHITE
            );

            // إعداد MaterialListView
            materialListViewClipboardItems.Columns.Add("Content", 200);
            materialListViewClipboardItems.View = View.Details;
            materialListViewClipboardItems.FullRowSelect = true;

            // إعداد ImageList لعرض الصور المصغرة
            imageList1 = new ImageList();
            imageList1.ImageSize = new Size(100, 100);  // ضبط حجم الصور المصغرة
            imageList1.ColorDepth = ColorDepth.Depth32Bit;
            materialListViewClipboardItems.SmallImageList = imageList1;  // ربط ImageList بـ MaterialListView

            // إعداد ToolTip لإظهار الرسائل
            copyToolTip = new ToolTip();
            copyToolTip.AutoPopDelay = 1000;  // الرسالة ستختفي بعد ثانية
            copyToolTip.InitialDelay = 0;     // لا تأخير في عرض الرسالة
            copyToolTip.ReshowDelay = 0;      // إعادة العرض فورًا

            // إعداد NotifyIcon
            trayMenu = new ContextMenuStrip();
            trayMenu.Items.Add("Exit", null, OnExit);  // إضافة خيار "Exit" لإنهاء البرنامج

            trayIcon = new NotifyIcon();
            trayIcon.Text = "M5-Copy - you can close it";
            trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40);  // يمكنك استخدام أيقونة مخصصة هنا
            trayIcon.ContextMenuStrip = trayMenu;  // تعيين القائمة إلى الأيقونة
            trayIcon.Visible = true;  // إظهار الأيقونة

            trayIcon.DoubleClick += TrayIcon_DoubleClick;  // استرجاع النافذة عند الضغط المزدوج

            // بدء مؤقت الحافظة
            clipboardCheckTimer.Start();

            // ربط الأحداث
            materialListViewClipboardItems.Click += materialListViewClipboardItems_Click;
            materialButtonClearHistory.Click += materialButtonClearHistory_Click;

            // إضافة الحدث عند محاولة إغلاق البرنامج
            this.FormClosing += Form1_FormClosing;
        }

        // دالة يتم استدعاؤها عند تحميل النموذج
        private void Form1_Load(object sender, EventArgs e)
        {
            // إعدادات إضافية عند تحميل النموذج، إذا لزم الأمر
        }

        // دالة التحقق الدوري من الحافظة باستخدام المؤقت
        private void clipboardCheckTimer_Tick(object sender, EventArgs e)
        {
            // التحقق مما إذا كانت الحافظة تحتوي على نص
            if (Clipboard.ContainsText())
            {
                string copiedText = Clipboard.GetText();
                if (!clipboardHistory.Exists(item => item.Content.Equals(copiedText)))
                {
                    clipboardHistory.Insert(0, new ClipboardItem { Content = copiedText, Type = ClipboardContentType.Text });
                    UpdateClipboardList();
                }
            }
            // التحقق مما إذا كانت الحافظة تحتوي على صورة
            else if (Clipboard.ContainsImage())
            {
                Image copiedImage = Clipboard.GetImage();
                string imageHash = GetImageHash(copiedImage);

                // استخدام تجزئة الصورة للتحقق مما إذا كانت موجودة مسبقًا
                if (!clipboardHistory.Exists(item => item.Type == ClipboardContentType.Image && GetImageHash((Image)item.Content) == imageHash))
                {
                    Image thumbnailImage = CreateThumbnail(copiedImage, 100, 100);  // إنشاء صورة مصغرة
                    imageList1.Images.Add(thumbnailImage);  // إضافة الصورة المصغرة إلى ImageList
                    clipboardHistory.Insert(0, new ClipboardItem { Content = copiedImage, Type = ClipboardContentType.Image });
                    UpdateClipboardList();
                }
            }
        }

        // تحديث قائمة العناصر المنسوخة في MaterialListView
        private void UpdateClipboardList()
        {
            materialListViewClipboardItems.Items.Clear();
            int imageIndex = 0;  // لضمان تعيين الفهرس الصحيح للصورة

            for (int i = 0; i < clipboardHistory.Count; i++)
            {
                var item = clipboardHistory[i];
                ListViewItem listItem;
                if (item.Type == ClipboardContentType.Text)
                {
                    listItem = new ListViewItem(item.Content.ToString());
                }
                else
                {
                    listItem = new ListViewItem("Image");
                    listItem.ImageIndex = imageIndex;  // تعيين الفهرس الصحيح للصورة
                    imageIndex++;
                }
                materialListViewClipboardItems.Items.Add(listItem);
            }
        }

        // إنشاء صورة مصغرة
        private Image CreateThumbnail(Image originalImage, int width, int height)
        {
            return (Image)(new Bitmap(originalImage, new Size(width, height)));
        }

        // نسخ العنصر تلقائيًا عند النقر عليه وإظهار رسالة
        private void materialListViewClipboardItems_Click(object sender, EventArgs e)
        {
            if (materialListViewClipboardItems.SelectedItems.Count > 0)
            {
                var selectedItem = clipboardHistory[materialListViewClipboardItems.SelectedItems[0].Index];

                // نسخ المحتوى
                if (selectedItem.Type == ClipboardContentType.Text)
                {
                    Clipboard.SetText(selectedItem.Content.ToString());
                    ShowCopyNotification("Text copied!");
                }
                else if (selectedItem.Type == ClipboardContentType.Image)
                {
                    Clipboard.SetImage((Image)selectedItem.Content);
                    ShowCopyNotification("Image copied!");
                }
            }
        }

        // مسح السجل عند الضغط على زر "Clear History"
        private void materialButtonClearHistory_Click(object sender, EventArgs e)
        {
            clipboardHistory.Clear();
            imageList1.Images.Clear();  // مسح الصور المصغرة من القائمة
            UpdateClipboardList();
        }

        // دالة لحساب تجزئة الصورة
        private string GetImageHash(Image image)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                // تحويل الصورة إلى بايتات باستخدام JPEG
                image.Save(ms, ImageFormat.Jpeg);
                byte[] imageBytes = ms.ToArray();

                // حساب التجزئة باستخدام SHA256
                using (SHA256 sha256 = SHA256.Create())
                {
                    byte[] hashBytes = sha256.ComputeHash(imageBytes);
                    return Convert.ToBase64String(hashBytes);
                }
            }
        }

        // دالة لإظهار إشعار النسخ
        private void ShowCopyNotification(string message)
        {
            // عرض رسالة ToolTip لفترة قصيرة
            copyToolTip.Show(message, this, this.PointToClient(Cursor.Position), 1000);  // عرض الرسالة بجانب مؤشر الفأرة
        }

        // إخفاء النافذة وإبقائها في منطقة الإعلام عند محاولة إغلاق البرنامج
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;  // إلغاء إغلاق البرنامج
            this.Hide();  // إخفاء النافذة
        }

        // استرجاع النافذة عند الضغط المزدوج على أيقونة البرنامج في منطقة الإعلام
        private void TrayIcon_DoubleClick(object sender, EventArgs e)
        {
            this.Show();  // إظهار النافذة مجددًا
            this.WindowState = FormWindowState.Normal;  // إعادة النافذة إلى وضعها الطبيعي
        }

        // دالة لإنهاء البرنامج عند اختيار Exit من القائمة
        private void OnExit(object sender, EventArgs e)
        {
            trayIcon.Visible = false;  // إخفاء أيقونة منطقة الإعلام
            trayIcon.Dispose();  // التخلص من NotifyIcon
            Application.Exit();  // إنهاء التطبيق بالكامل
            Environment.Exit(0);
        }
    }

    // نوع المحتوى (نص أو صورة)
    public enum ClipboardContentType
    {
        Text,
        Image
    }

    // كلاس يمثل عنصر الحافظة
    public class ClipboardItem
    {
        public object Content { get; set; }
        public ClipboardContentType Type { get; set; }
    }
}
