package Common.Visual.Windows.Dialog;
import Common.MainModule_;
import Common.Utils.TextLog;
import Common.Utils.Utils_;
import Common.Visual.Fonts.VisualiserFonts;
import Common.Visual.Themes.ThemeElement;
import Common.Visual.UI;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//T Тип объекта
//F Тип полей.
public class Dialog<T, F extends DialogFields> extends JDialog implements ThemeElement {
    public F fields; //рабочая область диалога.
    public String title_text;
    public JLabel lTitle = new JLabel();
    public boolean OK = false;
    //--------------------------------------
    public T Result = null;
    public Class<F> f = null;
    public TextLog Log = new TextLog(); //журнал валидации.
    protected JScrollPane scroll = null;
    protected JPanel buttonsPane = null;
    protected JButton btnOK = null;
    protected JButton btnCancel = null;
    protected JCheckBox showNoMore = null;
    protected Component content;
    //--------------------------------------
    public Dialog(Class<F> f_in) {
        f = f_in;
        setModal(true);
        toFront();
        getContentPane().setLayout(new BorderLayout());
        lTitle.setFont(MainModule_.instance.getUI().getTheme().Fonts.get(VisualiserFonts.Menu));
        if (!getIconPath().isEmpty()) {
            setIconImage(Utils_.getIcon(getIconPath()).getImage());
        }
        //делаем титульную надпись в самом окне чтобы не зависеть от языковой политики ОС
        getContentPane().add(lTitle, BorderLayout.NORTH);
        //сюда добавляется содержимое.
        content = null;
        CreateContent();
        InitFields(); //дополнительная инициализация полей..
        getContentPane().add(NeedsScroll() ? (scroll = new JScrollPane(content)) : content, BorderLayout.CENTER);
        CreateButtons();
        // call onCancel() when cross is clicked
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                MainModule_.instance.getUI().windowsStack.pop();
                onCancel();
                onClose();
            }
        });
        // pack(); //авторазмер окна.
        setLocationRelativeTo(null);
        LoadSize();
    }
    public String getIconPath() {
        return "";
    }
    public void CreateContent() {
        try {
            content = (fields = f.newInstance()).getContent();
            //--?
        } catch (Exception e) {
            Utils_.MainLog.PrintException(e);
        }
    }
    public void onClose() {
    }
    public void LoadSize() {
        setMinimumSize(new Dimension(getDefaultWidth(), getDefaultHeight()));
        setPreferredSize(new Dimension(getDefaultWidth(), getDefaultHeight()));
    }
    //бывает что у полей собственные скроллы
    public boolean NeedsScroll() {
        return true;
    }
    public boolean NeedsShowNoMore() {
        return false;
    }
    public int getDefaultWidth() {
        return 800;
    }
    public int getDefaultHeight() {
        return 450;
    }
    //создание полей формы( без заполнения)
    public void InitFields() {
    }
    public void CreateButtons() {
        btnOK = new JButton("   OK   ");
        btnCancel = new JButton("Отмена");
        buttonsPane = new JPanel();
        buttonsPane.setOpaque(true);
        buttonsPane.setBackground(Color.WHITE);
        btnOK.addActionListener(e -> onOK());
        btnCancel.addActionListener(e -> onCancel());
        buttonsPane.add(btnOK);
        buttonsPane.add(btnCancel);
        if (NeedsShowNoMore()) {
            buttonsPane.add(showNoMore = new JCheckBox("больше не показывать"));
            showNoMore.setOpaque(true);
            showNoMore.setBackground(Color.WHITE);
        }
        getContentPane().add(buttonsPane, BorderLayout.SOUTH);
    }
    public void BlockButtons() {
        btnOK.setVisible(false);
        btnCancel.setVisible(false);
    }
    public boolean isOnTop() {
        return true;
    }
    public boolean ShowDialog(String title, Object... params) {
        OK = false;
        title_text = title;
        Init(params);
        ShowTitle();
        setAlwaysOnTop(isOnTop());
        MainModule_.instance.getUI().windowsStack.push(this);
        setVisible(true);
        return OK;
    }
    public void ShowTitle() {
        lTitle.setText(getTitleText());
    }
    public String getTitleText() {
        return title_text;
    }
    public void Init(Object... params) {
    }
    public void onOK() {
        Log.Clear();
        validateFields();
        if (Log.isEmpty()) {
            ProcessResult();
            OK = true;
            CloseAction();
        } else
            UI.Error("Валидация не пройдена:\n" + Log.toString());
    }
    protected void onCancel() {
        CloseAction();
    }
    public void CloseAction() {
        dispose();
    }
    public void validateFields() {
    }
    public void ProcessResult() {
    }
    @Override
    public void applyTheme() {
        //todo -> Применение темы
    }
}
