using System;
using CPF.Platform;
using CPF.Input;
using CPF.Mac.Foundation;
using CPF.Mac.AppKit;
using CPF.Mac.CoreGraphics;
using CPF.Mac.ObjCRuntime;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
using CPF.Drawing;
using System.Collections.Generic;

namespace CPF.Mac
{
    class ClipboardImpl : DataObject, IClipboard
    {
        public ClipboardImpl() : base(NSPasteboard.GeneralPasteboard)
        {
        }

        public void Clear()
        {
            NSPasteboard.GeneralPasteboard.ClearContents();
        }

        public void SetData(params (DataFormat, object)[] data)
        {
            Clear();
            if (data != null)
            {
                foreach (var item in data)
                {
                    switch (item.Item1)
                    {
                        case DataFormat.FileNames:
                            //NSPasteboard.GeneralPasteboard.SetDataForType(,NSPasteboard.NSFilenamesType);
                            var fs = (IEnumerable<string>)item.Item2;
                            var ns = new NSMutableArray();
                            foreach (var s in fs)
                            {
                                ns.Add(new NSString(s));
                            }
                            NSPasteboard.GeneralPasteboard.SetPropertyListForType(ns, NSPasteboard.NSFilenamesType);
                            break;
                        case DataFormat.Html:
                            var l = Encoding.UTF8.GetByteCount(item.Item2.ToString());
                            var h = Marshal.AllocHGlobal(l);
                            Marshal.Copy(Encoding.UTF8.GetBytes(item.Item2.ToString()), 0, h, l);
                            using (var nsdata = NSData.FromBytes(h, (ulong)l))
                            {
                                NSPasteboard.GeneralPasteboard.SetDataForType(nsdata, NSPasteboard.NSHtmlType);
                                Marshal.FreeHGlobal(h);
                            }
                            break;
                        case DataFormat.Image:
                            var img = item.Item2 as Image;
                            var stream = img.SaveToStream(ImageFormat.Png);
                            stream.Position = 0;
                            var im = Marshal.AllocHGlobal((int)stream.Length);
                            var d = new byte[stream.Length];
                            stream.Read(d, 0, (int)stream.Length);
                            Marshal.Copy(d, 0, im, (int)stream.Length);
                            using (var nsdata = NSData.FromBytes(im, (ulong)stream.Length))
                            {
                                NSPasteboard.GeneralPasteboard.SetDataForType(nsdata, NSPasteboard.NSPictType);
                                Marshal.FreeHGlobal(im);
                            }
                            break;
                        case DataFormat.Text:
                            //var l1 = Encoding.UTF8.GetByteCount(item.Item2.ToString());
                            //var h1 = Marshal.AllocHGlobal(l1);
                            //Marshal.Copy(Encoding.UTF8.GetBytes(item.Item2.ToString()), 0, h1, l1);
                            //using (var nsdata = NSData.FromBytes(h1, (ulong)l1))
                            //{
                            //    NSPasteboard.GeneralPasteboard.SetDataForType(nsdata, NSPasteboard.NSStringType);
                            //    Marshal.FreeHGlobal(h1);
                            //}
                            NSPasteboard.GeneralPasteboard.SetStringForType(item.Item2.ToString(), NSPasteboard.NSStringType);
                            break;
                        default:
                            break;
                    }
                }
            }
        }
    }
}