package _VisualDVM.ServerObjectsCache;
import Common.Database.Objects.DBObject;
import _VisualDVM.TestingSystem.Common.Test.Test;
import _VisualDVM.TestingSystem.DVM.DVMConfiguration.DVMConfiguration;
import _VisualDVM.TestingSystem.DVM.DVMPackage.DVMPackage;
import _VisualDVM.TestingSystem.DVM.DVMSettings.DVMSettings;
import _VisualDVM.TestingSystem.SAPFOR.SapforConfiguration.SapforConfiguration;
import _VisualDVM.TestingSystem.SAPFOR.SapforPackage.SapforPackage;

import java.util.LinkedHashMap;
//нужен со стороны клиента для серверных объектов, чтобы в сокет не класть лишнего.
public class VisualCaches {
    static LinkedHashMap<Class, LinkedHashMap<Object, VisualCache>> allData = new LinkedHashMap<>();
    static LinkedHashMap<Object, VisualCache> getDataForClass(Class class_) {
        LinkedHashMap<Object, VisualCache> data;
        if (allData.containsKey(class_)) {
            data = allData.get(class_);
        } else {
            data = new LinkedHashMap<>();
            allData.put(class_, data);
        }
        return data;
    }
    public static void ClearDataForClass(Class class_) {
        if (allData.containsKey(class_)) {
            allData.get(class_).clear();
        }
    }
    //чтобы не трогать сами объекты и не сбить сериализацию
    static VisualCache createCache(Object object) {
        if (object instanceof Test) return new TestCache((Test) object);
        if (object instanceof DVMSettings) return new DVMSettingsCache((DVMSettings) object);
        if (object instanceof DVMConfiguration) return new DVMConfigurationCache((DVMConfiguration) object);
        if (object instanceof DVMPackage) return new DVMPackageCache((DVMPackage) object);
        if (object instanceof SapforConfiguration) return new SapforConfigurationCache((SapforConfiguration) object);
        if (object instanceof SapforPackage) return new SapforPackageCache((SapforPackage) object);
        return new VisualCache();
    }
    public static VisualCache GetCache(DBObject object) {
        VisualCache res = null;
        LinkedHashMap<Object, VisualCache> data = getDataForClass(object.getClass());
        if (!data.containsKey(object.getPK())) {
            data.put(object.getPK(), res = createCache(object));
        } else {
            res = data.get(object.getPK());
        }
        return res;
    }
    //Принудительно удалить старый и записать новый.
    public static void RefreshCache(DBObject object) {
        LinkedHashMap<Object, VisualCache> data = getDataForClass(object.getClass());
        //--
        if (data.containsKey(object.getPK())) {
            data.remove(object.getPK());
        }
        data.put(object.getPK(), createCache(object));
    }
    public static void DeleteCache(DBObject object) {
        DeleteCache(object.getClass(), object.getPK());
    }
    public static void DeleteCache(Class class_, Object pk) {
        LinkedHashMap<Object, VisualCache> data = getDataForClass(class_);
        if (data.containsKey(pk)) data.remove(pk);
    }
    public static void Print() {
        System.out.println("alldata size=" + allData.size());
        for (Class class_ : allData.keySet()) {
            System.out.println("class=" + class_.getSimpleName() + " size=" + allData.get(class_).size());
        }
    }
}
