package com.its.vms.ui;

import com.intellij.uiDesigner.core.GridConstraints;
import com.intellij.uiDesigner.core.GridLayoutManager;
import com.intellij.uiDesigner.core.Spacer;
import com.its.app.AppUtils;
import com.its.app.utils.SysUtils;
import com.its.vms.domain.NET;
import com.its.vms.dto.TbVmsCtlrDto;
import com.its.vms.service.AppRepositoryService;
import com.sun.management.OperatingSystemMXBean;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

import javax.swing.Timer;
import javax.swing.*;
import javax.swing.border.MatteBorder;
import javax.swing.plaf.FontUIResource;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import javax.swing.text.StyleContext;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.util.List;
import java.util.*;

@Slf4j
@Getter
public class MainUI {
    private static MainUI _instance = null;

    private SubUIController subUIController = null;
    private JFrame jFrame = null;
    private final OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    private Timer timer;
    private Long tick = Long.valueOf(0);
    private TbVmsCtlrDto selObj = null;

    private CtlrSttsTableModel ctlrSttsTableModel = null;
    private TableCellRenderer cellRenderer = new CtlrSttsTableCellRenderer();

    private JPanel rootPanel;
    private JPanel pnlCtlr;
    private JPanel pnlLog;
    private JPanel pnlLogTitle;
    private JPanel pnlCtlrTitle;
    private JButton btnLogDirOpen;
    private JButton btnLogPause;
    private JCheckBox chkLogPause;
    private JLabel lblSystime;
    private JPanel pnlStatusBar;
    private JTable tblCtlrList;
    private JTextArea taLog;
    private JButton btnLogCopy;
    private JLabel lblTotal;
    private JLabel lblError;
    private JLabel lblCpuRate;
    private JLabel lblMemoryUsage;
    private JPanel pnlControl;
    private JButton btnReset;
    private JButton btnDisconnect;
    private JTextField txtName;
    private JTextField txtId;
    private JLabel lblVmsInfo;
    private JButton btnControl;
    private boolean isUpdatable;

    public static MainUI getInstance() {
        return _instance;
    }

    public void displaySystime() {
        lblSystime.setText(" " + SysUtils.getSysTimeStr() + "  ");
        updateCommSttsTotal();
    }

    public void displayResource() {
        long memoryUsage = Math.round(((double) (osBean.getTotalPhysicalMemorySize() - osBean.getFreePhysicalMemorySize())) / (double) osBean.getTotalPhysicalMemorySize() * 100.0);
        lblMemoryUsage.setText(String.valueOf(memoryUsage));
        double cpuLoad = osBean.getSystemCpuLoad();
        if (cpuLoad >= 0.0 && cpuLoad <= 1.0) {
            lblCpuRate.setText(String.valueOf(Math.round(cpuLoad * 100.0)));
        } else {
            lblCpuRate.setText("---");
        }
    }

    public MainUI(JFrame jFrame) {
        System.setProperty("awt.useSystemAAFontSettings", "false"); // AntiAliasing false

        this.isUpdatable = false;
        this.jFrame = jFrame;
        if (_instance == null) {
            _instance = this;
            subUIController = new SubUIController(jFrame);
            subUIController.setVisible(false);
        }

        try {
            Font font = Font.createFont(Font.TRUETYPE_FONT, new File("fonts/D2Coding.ttc"));
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            ge.registerFont(font);
        } catch (FontFormatException | IOException e) {
        }
        Font d2font = new Font("D2Coding", Font.PLAIN, 14);
        taLog.setFont(d2font);

        displaySystime();
        displayResource();
        timer = new Timer(1000, new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                displaySystime();
                tick++;
                if (tick % 5 == 0) {
                    displayResource();
                }
            }
        });
        timer.start();

        chkLogPause.setFocusable(false);
        btnLogPause.setFocusable(false);
        btnLogDirOpen.setFocusable(false);
        btnLogCopy.setFocusable(false);

        //initTblListUI();

        btnLogPause.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                taLog.setText(null);
            }
        });
        btnLogDirOpen.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Runtime rt = Runtime.getRuntime();
                try {
                    rt.exec("explorer.exe logs");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }
        });
        chkLogPause.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JTextAreaOutputStream.isLoggingPause = chkLogPause.isSelected();
            }
        });
        btnLogCopy.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                StringSelection stringSelection = new StringSelection(taLog.getText());
                Clipboard clpBrd = Toolkit.getDefaultToolkit().getSystemClipboard();
                clpBrd.setContents(stringSelection, null);
            }
        });

        tblCtlrList.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent me) {
                // double click
                if (me.getClickCount() == 2) {
                    if (!updateControllerInfo()) {
                    }
                }
            }
        });
        btnDisconnect.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                controlController(1);
            }
        });
        btnReset.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                controlController(2);
            }
        });
        btnControl.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                controlController(4);
            }
        });
        lblVmsInfo.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                // double click
                if (me.getClickCount() == 2) {
                    AppRepositoryService repoService = (AppRepositoryService) AppUtils.getBean(AppRepositoryService.class);
                    repoService.getCtlrMap().forEach((key, obj) -> {
                        obj.resetConnectCount();
                    });
//                    for (Map.Entry<Long, TbVmsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
//                        TbVmsCtlr obj = e.getValue();
//                        obj.resetConnectCount();
//                    }
                }
                super.mouseClicked(me);
            }
        });
    }

    /**
     * 제어기 명령 처리
     *
     * @param type
     */
    public void controlController(int type) {
        if (this.selObj == null) {
            JOptionPane.showMessageDialog(getRootPanel(), "제어기가 선택되지 않았습니다. 목록을 더블클릭하여 제어기를 선택하세요.", "제어기 선택", JOptionPane.ERROR_MESSAGE);
            return;
        }
        if (this.selObj.getNetState() == NET.CLOSED) {
            JOptionPane.showMessageDialog(getRootPanel(), "제어기가 현재 연결이 되어 있지 않습니다.", "제어기 연결 상태", JOptionPane.ERROR_MESSAGE);
            return;
        }

        boolean isDirectCmd = true;
        String message = "", title = "";
        switch (type) {
            case 1:
                message = "제어기와의 연결을 종료 하시겠습니까?";
                title = "제어기 연결 종료";
                break;
            case 2:
                message = "제어기를 리셋 하시겠습니까?";
                title = "제어기 리셋";
                break;
            case 4:
                isDirectCmd = false;
                break;
            default:
                return;
        }
        if (isDirectCmd) {
            if (JOptionPane.showConfirmDialog(getRootPanel(), message, title, JOptionPane.YES_NO_OPTION) != 0) {
                return;
            }
        }

        boolean result = false;
        switch (type) {
            case 1:
                result = this.selObj.channelClose();
                break;
            case 2:
                result = this.selObj.reset();
                break;
            case 4:
                result = true;
                if (!this.subUIController.isVisible()) {
                    this.subUIController.setVisible(true);
                }
                this.subUIController.setState(JFrame.NORMAL);
                break;
            default:
                return;
        }
        if (!result) {
            JOptionPane.showMessageDialog(getRootPanel(), "명령 전송이 실패 하였습니다.", title, JOptionPane.ERROR_MESSAGE);
        }
    }

    public boolean updateControllerInfo() {
        if (subUIController.isVisible()) {
            //subUIController.setVisible(false);
        }
        if (!this.isUpdatable) {
            return false;
        }
        int row = tblCtlrList.getSelectedRow();
        if (row < 0) {
            JOptionPane.showMessageDialog(getRootPanel(), "목록에서 VMS 를 선택해주세요.", "VMS 제어", JOptionPane.ERROR_MESSAGE);
            return false;
        }

        txtId.setText("");
        txtName.setText("");
        CtlrSttsTableModel tableModel = (CtlrSttsTableModel) tblCtlrList.getModel();
        this.selObj = tableModel.getControllerInfo(row);
        if (this.selObj != null) {
            txtId.setText(this.selObj.getCtlrId());
            txtName.setText(this.selObj.getName());

            subUIController.updateInfo(this.selObj);
            //if (!subUIController.isVisible()) {
            //    subUIController.setVisible(true);
            //}
            //subUIController.setState(JFrame.NORMAL);
            return true;
        }
        return false;
    }

    /**
     * 목록 헤더 생성
     */
    private void initTblListUI(List<TbVmsCtlrDto> ctlrList) {

        this.ctlrSttsTableModel = new CtlrSttsTableModel(ctlrList);
        tblCtlrList.setModel(this.ctlrSttsTableModel);

        tblCtlrList.getTableHeader().setOpaque(false);
        tblCtlrList.getTableHeader().setBackground(Color.LIGHT_GRAY);
        tblCtlrList.setRowMargin(1);
        //tblCtlrList.setGridColor(Color.LIGHT_GRAY);
        tblCtlrList.setRowHeight(tblCtlrList.getRowHeight() + 5);
        //tblCtlrList.setRowSelectionAllowed(true);
        //tblCtlrList.setColumnSelectionAllowed(false);

        tblCtlrList.setBackground(Color.WHITE);
        tblCtlrList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        //tblCtlrList.setAutoCreateRowSorter(true); // sorting

        //tblCtlrList.addMouseListener(new ListMouseListener(null));

        TableColumnModel getColumnModel = tblCtlrList.getColumnModel();
        getColumnModel.getColumn(0).setPreferredWidth(30);  //  "#",
        getColumnModel.getColumn(1).setPreferredWidth(50);  //  "NO",
        getColumnModel.getColumn(2).setPreferredWidth(80);  //  "ID",
        getColumnModel.getColumn(3).setPreferredWidth(140); //  "Name",
        getColumnModel.getColumn(4).setPreferredWidth(95);  //  "IP Address",
        getColumnModel.getColumn(5).setPreferredWidth(45);  //  "Mode",
        getColumnModel.getColumn(6).setPreferredWidth(60);  //  "연결상태",
        getColumnModel.getColumn(7).setPreferredWidth(125); //  "Connect",
        getColumnModel.getColumn(8).setPreferredWidth(125); //  "Disconnect",
        getColumnModel.getColumn(9).setPreferredWidth(70);  //  "Connect Count",

        getColumnModel.getColumn(0).setMaxWidth(30);
        getColumnModel.getColumn(0).setMinWidth(30);
        getColumnModel.getColumn(0).setResizable(false);

//        for (int ii = 7; ii <= 11; ii++) {
//            getColumnModel.getColumn(ii).setMinWidth(0);
//            getColumnModel.getColumn(ii).setMaxWidth(0);
//            getColumnModel.getColumn(ii).setWidth(0);
//            getColumnModel.getColumn(ii).setResizable(false);
//        }

        Color color = UIManager.getColor("Table.gridColor");
        MatteBorder border = new MatteBorder(1, 1, 0, 0, color);
        tblCtlrList.setBorder(border);

        DefaultTableCellRenderer centerAlign = new DefaultTableCellRenderer();
        centerAlign.setHorizontalAlignment(JLabel.CENTER);
        for (int ii = 0; ii < getColumnModel.getColumnCount(); ii++) {
            getColumnModel.getColumn(ii).setCellRenderer(cellRenderer);
        }
        this.isUpdatable = true;
    }

    public void updateCommSttsTotal() {
        int ctlrTotal = 0;
        int ctlrError = 0;
        //for (Map.Entry<Long, TbVmsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
        AppRepositoryService repoService = (AppRepositoryService) AppUtils.getBean(AppRepositoryService.class);
        for (Map.Entry<Long, TbVmsCtlrDto> e : repoService.getCtlrMap().entrySet()) {
            TbVmsCtlrDto obj = e.getValue();
            if (StringUtils.equals("N", obj.getDelYn())) {
                ctlrTotal++;
                if (!"CMS0".equals(obj.getStts().getCommSttsCd())) {
                    ctlrError++;
                }
            }
        }
        lblTotal.setText(" " + ctlrTotal + " ");
        lblError.setText(" " + ctlrError + " ");

        if (this.isUpdatable) {
            CtlrSttsTableModel tableModel = (CtlrSttsTableModel) tblCtlrList.getModel();
            if (tableModel != null) {
                tableModel.fireTableDataChanged();
            }
        }
    }

    public void loadControllerInfo() {
        AppRepositoryService repoService = (AppRepositoryService) AppUtils.getBean(AppRepositoryService.class);
        //log.info("MainUI.loadControllerInfo: start. {} EA.", AppRepository.getInstance().getCtlrMap().size());
        log.info("MainUI.loadControllerInfo: start. {} EA.", repoService.getCtlrMap().size());
        SortedMap<Long, TbVmsCtlrDto> ctlrMap = new TreeMap<>();
        //for (Map.Entry<Long, TbVmsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
        for (Map.Entry<Long, TbVmsCtlrDto> e : repoService.getCtlrMap().entrySet()) {
            TbVmsCtlrDto obj = e.getValue();
            if (StringUtils.equals("N", obj.getDelYn())) {
                ctlrMap.put(obj.getVmsCtlrNmbr(), obj);
            }
        }
        List<TbVmsCtlrDto> ctlrList = new ArrayList<TbVmsCtlrDto>(ctlrMap.values());
        initTblListUI(ctlrList);
        updateCommSttsTotal();
        log.info("MainUI.loadControllerInfo: ..end. {} EA.", ctlrList.size());
    }

    public void updateCtlrStts(TbVmsCtlrDto obj) {
        if (!this.isUpdatable) {
            return;
        }
        if (this.ctlrSttsTableModel == null) {
            return;
        }
        for (int ii = 0; ii < this.ctlrSttsTableModel.getRowCount(); ii++) {
            if (obj.getCtlrId().equals(this.ctlrSttsTableModel.getValueAt(ii, 2).toString())) {
                int modelRow = tblCtlrList.convertRowIndexToModel(ii);
                this.ctlrSttsTableModel.setValue(obj, ii, modelRow);
                break;
            }
        }
        CtlrSttsTableModel tableModel = (CtlrSttsTableModel) tblCtlrList.getModel();
        if (tableModel != null) {
            tableModel.fireTableDataChanged();
        }
    }

    public static void error(String msg) {
        MainUI UI = MainUI.getInstance();
        if (UI == null || UI.chkLogPause.isSelected()) {
            return;
        }
        synchronized (UI.taLog) {
            if (UI.taLog.getLineCount() > 2000) {
                UI.taLog.setText(null);
            }
            UI.taLog.append(msg);
            UI.taLog.setCaretPosition(UI.taLog.getDocument().getLength());
        }
    }

    public static void info(String msg) {
        MainUI UI = MainUI.getInstance();
        if (UI == null || UI.chkLogPause.isSelected()) {
            return;
        }
        synchronized (UI.taLog) {
            synchronized (UI.taLog) {
                if (UI.taLog.getLineCount() > 2000) {
                    UI.taLog.setText(null);
                }
                UI.taLog.append(msg);
                UI.taLog.setCaretPosition(UI.taLog.getDocument().getLength());
            }
        }
    }


    {
// GUI initializer generated by IntelliJ IDEA GUI Designer
// >>> IMPORTANT!! <<<
// DO NOT EDIT OR ADD ANY CODE HERE!
        $$$setupUI$$$();
    }

    /**
     * Method generated by IntelliJ IDEA GUI Designer
     * >>> IMPORTANT!! <<<
     * DO NOT edit this method OR call it in your code!
     *
     * @noinspection ALL
     */
    private void $$$setupUI$$$() {
        rootPanel = new JPanel();
        rootPanel.setLayout(new GridLayoutManager(3, 1, new Insets(0, 0, 0, 0), -1, -1));
        pnlCtlr = new JPanel();
        pnlCtlr.setLayout(new GridLayoutManager(3, 1, new Insets(10, 4, 0, 4), -1, -1));
        rootPanel.add(pnlCtlr, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false));
        pnlCtlrTitle = new JPanel();
        pnlCtlrTitle.setLayout(new GridLayoutManager(1, 6, new Insets(0, 0, 0, 2), -1, -1));
        pnlCtlr.add(pnlCtlrTitle, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
        lblVmsInfo = new JLabel();
        Font lblVmsInfoFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, lblVmsInfo.getFont());
        if (lblVmsInfoFont != null) lblVmsInfo.setFont(lblVmsInfoFont);
        lblVmsInfo.setHorizontalAlignment(2);
        lblVmsInfo.setHorizontalTextPosition(11);
        lblVmsInfo.setIcon(new ImageIcon(getClass().getResource("/static/image/controller.png")));
        lblVmsInfo.setText("VMS 정보");
        pnlCtlrTitle.add(lblVmsInfo, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        final Spacer spacer1 = new Spacer();
        pnlCtlrTitle.add(spacer1, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
        final JLabel label1 = new JLabel();
        Font label1Font = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, label1.getFont());
        if (label1Font != null) label1.setFont(label1Font);
        label1.setText("VMS 전체: ");
        pnlCtlrTitle.add(label1, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        final JLabel label2 = new JLabel();
        Font label2Font = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, label2.getFont());
        if (label2Font != null) label2.setFont(label2Font);
        label2.setText("통신 이상: ");
        pnlCtlrTitle.add(label2, new GridConstraints(0, 4, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        lblTotal = new JLabel();
        Font lblTotalFont = this.$$$getFont$$$("Malgun Gothic", Font.BOLD, 12, lblTotal.getFont());
        if (lblTotalFont != null) lblTotal.setFont(lblTotalFont);
        lblTotal.setHorizontalAlignment(0);
        lblTotal.setHorizontalTextPosition(0);
        lblTotal.setText("    -");
        pnlCtlrTitle.add(lblTotal, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        lblError = new JLabel();
        Font lblErrorFont = this.$$$getFont$$$("Malgun Gothic", Font.BOLD, 12, lblError.getFont());
        if (lblErrorFont != null) lblError.setFont(lblErrorFont);
        lblError.setForeground(new Color(-65536));
        lblError.setHorizontalAlignment(0);
        lblError.setHorizontalTextPosition(0);
        lblError.setText("    -");
        pnlCtlrTitle.add(lblError, new GridConstraints(0, 5, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        final JScrollPane scrollPane1 = new JScrollPane();
        pnlCtlr.add(scrollPane1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false));
        tblCtlrList = new JTable();
        Font tblCtlrListFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, tblCtlrList.getFont());
        if (tblCtlrListFont != null) tblCtlrList.setFont(tblCtlrListFont);
        scrollPane1.setViewportView(tblCtlrList);
        pnlControl = new JPanel();
        pnlControl.setLayout(new GridLayoutManager(1, 7, new Insets(0, 0, 0, 2), 1, 1));
        pnlCtlr.add(pnlControl, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
        final Spacer spacer2 = new Spacer();
        pnlControl.add(spacer2, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
        btnReset = new JButton();
        Font btnResetFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, btnReset.getFont());
        if (btnResetFont != null) btnReset.setFont(btnResetFont);
        btnReset.setText("  리셋  ");
        pnlControl.add(btnReset, new GridConstraints(0, 5, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        btnDisconnect = new JButton();
        Font btnDisconnectFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, btnDisconnect.getFont());
        if (btnDisconnectFont != null) btnDisconnect.setFont(btnDisconnectFont);
        btnDisconnect.setText("연결끊기");
        pnlControl.add(btnDisconnect, new GridConstraints(0, 4, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        txtName = new JTextField();
        txtName.setEditable(false);
        Font txtNameFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, txtName.getFont());
        if (txtNameFont != null) txtName.setFont(txtNameFont);
        txtName.setHorizontalAlignment(2);
        txtName.setText("VMS 명칭");
        pnlControl.add(txtName, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, new Dimension(200, -1), new Dimension(200, -1), new Dimension(200, -1), 0, false));
        txtId = new JTextField();
        txtId.setEditable(false);
        Font txtIdFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, txtId.getFont());
        if (txtIdFont != null) txtId.setFont(txtIdFont);
        txtId.setHorizontalAlignment(0);
        txtId.setText("ID");
        pnlControl.add(txtId, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, new Dimension(130, -1), new Dimension(130, -1), new Dimension(130, -1), 0, false));
        final JLabel label3 = new JLabel();
        Font label3Font = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, label3.getFont());
        if (label3Font != null) label3.setFont(label3Font);
        label3.setIcon(new ImageIcon(getClass().getResource("/static/image/select.png")));
        label3.setText("선택한 VMS  ");
        pnlControl.add(label3, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        btnControl = new JButton();
        Font btnControlFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, btnControl.getFont());
        if (btnControlFont != null) btnControl.setFont(btnControlFont);
        btnControl.setText("  제어  ");
        pnlControl.add(btnControl, new GridConstraints(0, 6, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        pnlLog = new JPanel();
        pnlLog.setLayout(new GridLayoutManager(2, 1, new Insets(0, 4, 0, 4), -1, -1));
        rootPanel.add(pnlLog, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, new Dimension(-1, 250), new Dimension(-1, 250), new Dimension(-1, 250), 0, false));
        pnlLogTitle = new JPanel();
        pnlLogTitle.setLayout(new GridLayoutManager(1, 6, new Insets(0, 0, 0, 2), 1, 1));
        pnlLog.add(pnlLogTitle, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
        final JLabel label4 = new JLabel();
        Font label4Font = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, label4.getFont());
        if (label4Font != null) label4.setFont(label4Font);
        label4.setHorizontalAlignment(2);
        label4.setIcon(new ImageIcon(getClass().getResource("/static/image/logging.png")));
        label4.setText("시스템 로그");
        pnlLogTitle.add(label4, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        final Spacer spacer3 = new Spacer();
        pnlLogTitle.add(spacer3, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
        btnLogDirOpen = new JButton();
        Font btnLogDirOpenFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, btnLogDirOpen.getFont());
        if (btnLogDirOpenFont != null) btnLogDirOpen.setFont(btnLogDirOpenFont);
        btnLogDirOpen.setHorizontalTextPosition(0);
        btnLogDirOpen.setText("로그 폴더");
        pnlLogTitle.add(btnLogDirOpen, new GridConstraints(0, 5, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        btnLogPause = new JButton();
        Font btnLogPauseFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, btnLogPause.getFont());
        if (btnLogPauseFont != null) btnLogPause.setFont(btnLogPauseFont);
        btnLogPause.setHorizontalTextPosition(0);
        btnLogPause.setText("지우기");
        pnlLogTitle.add(btnLogPause, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        chkLogPause = new JCheckBox();
        Font chkLogPauseFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, chkLogPause.getFont());
        if (chkLogPauseFont != null) chkLogPause.setFont(chkLogPauseFont);
        chkLogPause.setHorizontalAlignment(0);
        chkLogPause.setHorizontalTextPosition(11);
        chkLogPause.setText("멈춤");
        pnlLogTitle.add(chkLogPause, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        btnLogCopy = new JButton();
        Font btnLogCopyFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, btnLogCopy.getFont());
        if (btnLogCopyFont != null) btnLogCopy.setFont(btnLogCopyFont);
        btnLogCopy.setText("복사");
        pnlLogTitle.add(btnLogCopy, new GridConstraints(0, 4, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        final JScrollPane scrollPane2 = new JScrollPane();
        Font scrollPane2Font = this.$$$getFont$$$("D2Coding", Font.PLAIN, 12, scrollPane2.getFont());
        if (scrollPane2Font != null) scrollPane2.setFont(scrollPane2Font);
        pnlLog.add(scrollPane2, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false));
        taLog = new JTextArea();
        taLog.setBackground(new Color(-16777216));
        taLog.setCaretColor(new Color(-1));
        taLog.setEditable(false);
        Font taLogFont = this.$$$getFont$$$("D2Coding", Font.PLAIN, 14, taLog.getFont());
        if (taLogFont != null) taLog.setFont(taLogFont);
        taLog.setForeground(new Color(-1));
        taLog.setMargin(new Insets(4, 4, 4, 4));
        taLog.setText("[10:50:08.561] [ INFO] ************************************************************************************\n[10:50:08.561] [ INFO] **                   Center Communication Server Information                      **\n[10:50:08.561] [ INFO] **     bindAddress: 0.0.0.0\n[10:50:08.561] [ INFO] **      listenPort: 9901\n[10:50:08.561] [ INFO] **         backlog: 1024\n[10:50:08.561] [ INFO] **   acceptThreads: 16\n[10:50:08.561] [ INFO] **   workerThreads: 16\n[10:50:08.561] [ INFO] ************************************************************************************\n");
        scrollPane2.setViewportView(taLog);
        pnlStatusBar = new JPanel();
        pnlStatusBar.setLayout(new GridLayoutManager(1, 7, new Insets(0, 4, 4, 4), -1, -1));
        rootPanel.add(pnlStatusBar, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
        final Spacer spacer4 = new Spacer();
        pnlStatusBar.add(spacer4, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
        lblSystime = new JLabel();
        Font lblSystimeFont = this.$$$getFont$$$("Malgun Gothic", Font.BOLD, 12, lblSystime.getFont());
        if (lblSystimeFont != null) lblSystime.setFont(lblSystimeFont);
        lblSystime.setHorizontalAlignment(0);
        lblSystime.setHorizontalTextPosition(0);
        lblSystime.setText(" 2022-08-04 13:24:33 ");
        pnlStatusBar.add(lblSystime, new GridConstraints(0, 6, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        final JLabel label5 = new JLabel();
        label5.setIcon(new ImageIcon(getClass().getResource("/static/image/on.png")));
        label5.setText(" ");
        pnlStatusBar.add(label5, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        lblCpuRate = new JLabel();
        Font lblCpuRateFont = this.$$$getFont$$$("Malgun Gothic", Font.BOLD, 12, lblCpuRate.getFont());
        if (lblCpuRateFont != null) lblCpuRate.setFont(lblCpuRateFont);
        lblCpuRate.setHorizontalAlignment(2);
        lblCpuRate.setHorizontalTextPosition(0);
        lblCpuRate.setText("    ");
        pnlStatusBar.add(lblCpuRate, new GridConstraints(0, 5, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, new Dimension(40, -1), new Dimension(40, -1), new Dimension(40, -1), 0, false));
        lblMemoryUsage = new JLabel();
        Font lblMemoryUsageFont = this.$$$getFont$$$("Malgun Gothic", Font.BOLD, 12, lblMemoryUsage.getFont());
        if (lblMemoryUsageFont != null) lblMemoryUsage.setFont(lblMemoryUsageFont);
        lblMemoryUsage.setHorizontalAlignment(2);
        lblMemoryUsage.setHorizontalTextPosition(0);
        lblMemoryUsage.setText("    ");
        pnlStatusBar.add(lblMemoryUsage, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, new Dimension(40, -1), new Dimension(40, -1), new Dimension(40, -1), 0, false));
        final JLabel label6 = new JLabel();
        Font label6Font = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, label6.getFont());
        if (label6Font != null) label6.setFont(label6Font);
        label6.setHorizontalAlignment(0);
        label6.setHorizontalTextPosition(0);
        label6.setText("  CPU 사용율(%):");
        pnlStatusBar.add(label6, new GridConstraints(0, 4, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        final JLabel label7 = new JLabel();
        Font label7Font = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, label7.getFont());
        if (label7Font != null) label7.setFont(label7Font);
        label7.setHorizontalAlignment(0);
        label7.setHorizontalTextPosition(0);
        label7.setText("  메모리 사용율(%):");
        pnlStatusBar.add(label7, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
    }

    /**
     * @noinspection ALL
     */
    private Font $$$getFont$$$(String fontName, int style, int size, Font currentFont) {
        if (currentFont == null) return null;
        String resultName;
        if (fontName == null) {
            resultName = currentFont.getName();
        } else {
            Font testFont = new Font(fontName, Font.PLAIN, 10);
            if (testFont.canDisplay('a') && testFont.canDisplay('1')) {
                resultName = fontName;
            } else {
                resultName = currentFont.getName();
            }
        }
        Font font = new Font(resultName, style >= 0 ? style : currentFont.getStyle(), size >= 0 ? size : currentFont.getSize());
        boolean isMac = System.getProperty("os.name", "").toLowerCase(Locale.ENGLISH).startsWith("mac");
        Font fontWithFallback = isMac ? new Font(font.getFamily(), font.getStyle(), font.getSize()) : new StyleContext().getFont(font.getFamily(), font.getStyle(), font.getSize());
        return fontWithFallback instanceof FontUIResource ? fontWithFallback : new FontUIResource(fontWithFallback);
    }

    /**
     * @noinspection ALL
     */
    public JComponent $$$getRootComponent$$$() {
        return rootPanel;
    }

}
