package _VisualDVM.ServerObjectsCache;
import Common.Database.Objects.DBObject;
import _VisualDVM.TestingSystem.Common.Configuration.Configuration;
import _VisualDVM.TestingSystem.Common.TestingPackage.TestingPackage;
import _VisualDVM.TestingSystem.DVM.DVMConfiguration.DVMConfiguration;
import _VisualDVM.TestingSystem.SAPFOR.SapforConfiguration.SapforConfiguration;

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;
    }
    //чтобы не трогать сами объекты и не сбить сериализацию
    static VisualCache createCache(Object object) {
        if (object instanceof SapforConfiguration)
            return new SapforConfigurationCache((Configuration) object);
        if (object instanceof DVMConfiguration)
            return new DVMConfigurationCache((Configuration) object);
        if (object instanceof TestingPackage)
            return new PackageCache((TestingPackage) 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())) {
            //   System.out.println("get visual cache for " + object.getPK()+" "+object.getClass());
            //   System.out.println("cache not found, creating...");
            data.put(object.getPK(), res = createCache(object));
        } else {
            //  System.out.println("cache found");
            res = data.get(object.getPK());
        }
        return res;
    }
    //Принудительно удалить старый и записать новый.
    public static void RefreshCache(DBObject object) {
        // System.out.println("refresh cache for " + object.getPK()+" "+object.getClass().getSimpleName());
        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) {
        //   System.out.println("Delete cache for " + pk+" "+class_);
        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());
        }
    }
}
