package Common.Database.Tables;
import Common.Database.Objects.DBObject;
import Common.Visual.DataSetControlForm;
import Common.Visual.UI;

import javax.swing.*;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Vector;
public class DataSet<K, D extends DBObject> extends DataSetAnchestor {
    public Class<D> d; //класс объектов.
    public LinkedHashMap<K, D> Data = new LinkedHashMap<>(); //наполнение
    Class<K> k; //класс первичного ключа.
    //-
    DataSetControlForm ui = null;
    //--
    public DataSet(Class<K> k_in, Class<D> d_in) {
        k = k_in;
        d = d_in;
    }
    //--
    public String getPluralDescription() {
        return "";
    }
    public String getSingleDescription() {
        return "";
    }
    //---
    protected DataSetControlForm createUI(JPanel mountPanel) {
        return null;
    }
    //БАЗА ДАННЫХ
    public String getName() {
        return d.getSimpleName();
    }
    public String QName() {
        return "\"" + getName() + "\"";
    }
    public String getPKName() {
        return "";
    } //получить имя ключевого поля. нужно для таблиц.
    //ИНТЕРФЕЙС
    public DataSetControlForm<D> getUI() {
        return ui;
    }
    public void mountUI(JPanel mountPanel_in) {
        UI.Clear(mountPanel_in);
        ui = createUI(mountPanel_in);
    }
    public void ClearUI() {
        if ((ui != null) && ui.isShown()) {
            ui.ClearSelection();
            ui.Clear();
        }
    }
    public void ShowUI() {
        if (ui != null) {
            ui.Show();
        }
    }
    public void ShowUI(Object key) {
        if (ui != null) {
            ui.Show(key);
        }
    }
    //СОДЕРЖИМОЕ
    public D getFirstRecord() {
        return Data.values().stream().findFirst().orElse(null);
    }
    public Vector<D> getOrderedRecords(Comparator<D> comparator) {
        Vector<D> res = new Vector<>(Data.values());
        res.sort(comparator);
        return res;
    }
    public void put(Object key, D object) {
        Data.put((K) key, object);
    }
    public D get(Object key) {
        return Data.get(key);
    }
    public void clear() {
        Data.clear();
    }
    public int size() {
        return Data.size();
    }
    public boolean containsKey(Object key) {
        return Data.containsKey(key);
    }
    //--
    public boolean isEqual(D o1, D o2) {
        return false;
    }
}
