//Copyright (C) 2014+ Marco (Phoenix) Calautti.

//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, version 2.0.

//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License 2.0 for more details.

//A copy of the GPL 2.0 should have been included with the program.
//If not, see http://www.gnu.org/licenses/

//Official repository and contact information can be found at
//http://github.com/marco-calautti/Rainbow

using Rainbow.ImgLib.Formats.Serialization.Metadata;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace Rainbow.ImgLib.Common
{
    public static class InteropUtils
    {
        public static void WriteTo(GenericDictionary dictionary, MetadataWriter metadata)
        {
            foreach(string key in dictionary.Keys)
            {
                object value = dictionary.Get<object>(key);
                metadata.GetType().InvokeMember("Put", BindingFlags.InvokeMethod, Type.DefaultBinder, metadata, new object[]{ key, value });
            }
        }

        public static void ReadFrom(MetadataReader metadata, GenericDictionary dictionary)
        {
            foreach (string key in metadata.Keys)
            {
                Type myType = metadata.GetValueType(key);

                MethodInfo method = dictionary.GetType().GetMethod("Put");
                method = method.MakeGenericMethod(myType);

                MethodInfo metaMethod = metadata.GetType().GetMethod("Get");
                metaMethod = metaMethod.MakeGenericMethod(myType);

                object value = metaMethod.Invoke(metadata, new object[] { key });
                method.Invoke(dictionary, new object[] { key, value });
            }
        }
    }
}
