using System;

namespace Unity.VisualScripting
{
    public class Clipboard
    {
        public SerializationData data { get; private set; }
        public Type dataType { get; private set; }
        public bool containsData => dataType != null;

        public void Clear()
        {
            data = default(SerializationData);
            dataType = null;
        }

        public void Copy(object value)
        {
            Ensure.That(nameof(value)).IsNotNull(value);

            data = value.Serialize();
            dataType = value.GetType();
        }

        public bool CanPaste(Type type)
        {
            return containsData && dataType.IsConvertibleTo(type, true);
        }

        public bool CanPaste<T>()
        {
            return CanPaste(typeof(T));
        }

        public T Paste<T>()
        {
            return (T)Paste(typeof(T));
        }

        public object Paste()
        {
            if (!containsData)
            {
                throw new InvalidOperationException($"Graph clipboard does not contain data.");
            }

            return data.Deserialize();
        }

        public object Paste(Type type)
        {
            if (!CanPaste(type))
            {
                throw new InvalidOperationException($"Graph clipboard does not contain '{type.CSharpName(false)}'.");
            }

            return ConversionUtility.Convert(Paste(), type);
        }
    }
}