//============= Copyright (c) Ludic GmbH, All rights reserved. ==============
//
// Purpose: Part of the My Behaviour Tree Code
//
//=============================================================================

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

namespace MyBT {
    /// <summary>
    /// usage:
    /// [System.Serializable] public class DictionaryOfStringAndInt : SerializableDictionary<string, int> {}
    /// </summary>
    [Serializable]
    public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, ISerializationCallbackReceiver {
        [SerializeField]
        private List<TKey> keys = new List<TKey>();
        
        [SerializeField]
        private List<TValue> values = new List<TValue>();
        
        // save the dictionary to lists
        public void OnBeforeSerialize() {
            keys.Clear();
            values.Clear();
            foreach(KeyValuePair<TKey, TValue> pair in this) {
                // Debug.Log($"Serialize: {pair.Key} {pair.Value}");
                keys.Add(pair.Key);
                values.Add(pair.Value);
            }
        }
        
        // load dictionary from lists
        public void OnAfterDeserialize() {
            this.Clear();

            if(keys.Count != values.Count) {
                Debug.LogError("there are {0} keys and {1} values after deserialization. Make sure that both key and value types are serializable.");
                //throw new System.Exception(string.Format("there are {0} keys and {1} values after deserialization. Make sure that both key and value types are serializable."));
            }

            for(int i = 0; i < keys.Count; i++) {
                // Debug.Log($"Serialize: {keys[i]} {values[i]}");
                this.Add(keys[i], values[i]);
            }
        }
    }
}