package com.its.pis.ui;

import com.intellij.uiDesigner.core.GridConstraints;
import com.intellij.uiDesigner.core.GridLayoutManager;
import com.intellij.uiDesigner.core.Spacer;
import com.its.app.utils.SysUtils;
import com.its.pis.domain.NET;
import com.its.pis.entity.TbVdsCtlr;
import com.its.pis.global.AppRepository;
import com.its.pis.service.VdsCtlrService;
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 VdsCtlrService vdsCtlrService = null;
    OperatingSystemMXBean osBean = null;
    private Timer timer;
    private Long tick = Long.valueOf(0);
    private TbVdsCtlr selObj = null;

    private CtlrSttsTableModel ctlrSttsTableModel;
    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 btnImage;
    private JButton btnInitialize;
    private JButton btnReset;
    private JButton btnDisconnect;
    private JTextField txtName;
    private JTextField txtId;

    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();
        lblCpuRate.setText(String.valueOf(Math.round(cpuLoad * 100.0)));
    }

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

        this.jFrame = jFrame;
        if (_instance == null) {
            _instance = this;

            subUIController = new SubUIController(jFrame);
            subUIController.setVisible(false);
        }

        osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
        try {
            Font font = Font.createFont(Font.TRUETYPE_FONT, new File("fonts/D2Coding.ttc"));
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            ge.registerFont(font);
        } catch (FontFormatException e) {
        } catch (IOException e) {
        }

        //taLog.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
        Font d2font = new Font("D2Coding", Font.PLAIN, 14);
        if (d2font != null) {
            taLog.setFont(d2font);
        }

//        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
//        String fontNames[] = ge.getAvailableFontFamilyNames();
//        for (int ii = 0; ii < fontNames.length; ii++) {
//            log.error("GraphicsEnvironment Fonts: {}", fontNames[ii]);
//        }
//        final Font fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
//        for (Font font : fonts) {
//            log.error("FONTS: {}", font);
//        }

        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()) {
                        if (subUIController.isVisible()) {
                            subUIController.setVisible(false);
                        }
                    }
                }
            }
        });
        btnDisconnect.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                controlController(1);
            }
        });
        btnReset.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                controlController(2);
            }
        });
        btnInitialize.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                controlController(3);
            }
        });
        btnImage.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                controlController(4);
            }
        });
    }

    /**
     * 제어기 명령 처리
     *
     * @param type
     */
    public void controlController(int type) {
        if (selObj == null) {
            JOptionPane.showMessageDialog(getRootPanel(), "제어기가 선택되지 않았습니다. 목록을 더블클릭하여 제어기를 선택하세요.", "제어기 선택", JOptionPane.ERROR_MESSAGE);
            return;
        }
        if (selObj.getNetState() == NET.CLOSED) {
            JOptionPane.showMessageDialog(getRootPanel(), "제어기가 현재 연결이 되어 있지 않습니다.", "제어기 연결 상태", JOptionPane.ERROR_MESSAGE);
            return;
        }
        String message, title;
        switch (type) {
            case 1:
                message = "제어기와의 연결을 종료 하시겠습니까?";
                title = "제어기 연결 종료";
                break;
            case 2:
                message = "제어기를 리셋 하시겠습니까?";
                title = "제어기 리셋";
                break;
            case 3:
                message = "제어기를 초기화 하시겠습니까?";
                title = "제어기 초기화";
                break;
            case 4:
                message = "제어기의 정지영상 정보를 요청하시겠습니까?";
                title = "제어기 정지영상 요청";
                break;
            default:
                return;
        }
        if (JOptionPane.showConfirmDialog(getRootPanel(), message, title, JOptionPane.YES_NO_OPTION) != 0) {
            return;
        }

        boolean result = false;
        switch (type) {
            case 1:
                result = selObj.channelClose();
                break;
            case 2:
                result = selObj.reset();
                break;
            case 3:
                result = selObj.initialize();
                break;
            case 4:
                result = selObj.stopImage((byte) 0x01);
                break;
            default:
                return;
        }
        if (!result) {
            JOptionPane.showMessageDialog(getRootPanel(), "명령 전송이 실패 하였습니다.", title, JOptionPane.ERROR_MESSAGE);
        }
    }

    public boolean updateControllerInfo() {
        if (subUIController.isVisible()) {
            subUIController.setVisible(false);
        }

        int row = tblCtlrList.getSelectedRow();
        if (row < 0) {
            return false;
        }

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

            subUIController.updateInfo(selObj);
            if (!subUIController.isVisible()) {
                subUIController.setVisible(true);
            }
            return true;
        }
        return false;
    }

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

        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);

        ctlrSttsTableModel = new CtlrSttsTableModel(ctlrList);
        tblCtlrList.setModel(ctlrSttsTableModel);
        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);  //  "S",
        getColumnModel.getColumn(1).setPreferredWidth(75);  //  "번호",
        getColumnModel.getColumn(2).setPreferredWidth(75);  //  "시설물ID",
        getColumnModel.getColumn(3).setPreferredWidth(260); //  "명칭",
        getColumnModel.getColumn(4).setPreferredWidth(120); //  "IP",
        getColumnModel.getColumn(5).setPreferredWidth(55);  //  "PORT",
        getColumnModel.getColumn(6).setPreferredWidth(70);  //  "연결상태",
        getColumnModel.getColumn(7).setPreferredWidth(50);  //  "도어",
        getColumnModel.getColumn(8).setPreferredWidth(50);  //  "팬",
        getColumnModel.getColumn(9).setPreferredWidth(50);  //  "히터",
        getColumnModel.getColumn(10).setPreferredWidth(50);  //  "온도",
        getColumnModel.getColumn(11).setPreferredWidth(50); //  "Video",
        getColumnModel.getColumn(12).setPreferredWidth(120);
        getColumnModel.getColumn(13).setPreferredWidth(120);
        getColumnModel.getColumn(0).setMaxWidth(30);
        getColumnModel.getColumn(0).setMinWidth(30);
        getColumnModel.getColumn(0).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);
        }
    }

    public void updateCommSttsTotal() {
        int ctlrTotal = 0;
        int ctlrError = 0;
        for (Map.Entry<String, TbVdsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
            TbVdsCtlr obj = e.getValue();
            if (StringUtils.equals("N", obj.getDEL_YN()) && StringUtils.equals("Y", obj.getVALD_YN())) {
                ctlrTotal++;
                if (!"CMS0".equals(obj.getStts().getCMNC_STTS_CD())) {
                    ctlrError++;
                }
            }
        }
        lblTotal.setText(" " + ctlrTotal + " ");
        lblError.setText(" " + ctlrError + " ");
    }

    public void LoadControllerInfo(VdsCtlrService vdsCtlrService) {
        this.vdsCtlrService = vdsCtlrService;

        SortedMap<Integer, TbVdsCtlr> ctlrMap = new TreeMap<>();
        for (Map.Entry<String, TbVdsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
            TbVdsCtlr obj = e.getValue();
            if (StringUtils.equals("N", obj.getDEL_YN()) && StringUtils.equals("Y", obj.getVALD_YN())) {
                ctlrMap.put(Integer.valueOf(obj.getVDS_CTLR_NMBR()), obj);
            }
        }
        List<TbVdsCtlr> ctlrList = new ArrayList<TbVdsCtlr>(ctlrMap.values());
        initTblListUI(ctlrList);
//        for (Map.Entry<Integer, TbVdsCtlr> e : ctlrMap.entrySet()) {
//            TbVdsCtlr obj = e.getValue();
//            ctlrSttsTableModel.Add(obj);
//        }
        updateCommSttsTotal();
    }

    public void updateCtlrStts(TbVdsCtlr obj) {

        //CtlrSttsTableModel ctlrSttsTableModel = (CtlrSttsTableModel)tblCtlrList.getModel();
        for (int ii = 0; ii < ctlrSttsTableModel.getRowCount(); ii++) {
            if (obj.getVDS_CTLR_ID().equals(ctlrSttsTableModel.getValueAt(ii, 2).toString())) {
                int modelRow = tblCtlrList.convertRowIndexToModel(ii);
//                //int viewColumn = tblCtlrList.getSelectedColumn();
//                int modelColumn = tblCtlrList.convertColumnIndexToModel(4);
//                Object cell = tblCtlrList.getValueAt(modelRow, modelColumn);
//                log.error("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX: {}", cell);
                ctlrSttsTableModel.setValue(obj, ii, modelRow);
                break;
            }
        }
    }

    {
// 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));
        final JLabel label1 = new JLabel();
        Font label1Font = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, label1.getFont());
        if (label1Font != null) label1.setFont(label1Font);
        label1.setHorizontalAlignment(2);
        label1.setHorizontalTextPosition(11);
        label1.setIcon(new ImageIcon(getClass().getResource("/static/image/controller.png")));
        label1.setText("제어기 정보");
        pnlCtlrTitle.add(label1, 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 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, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 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.setText("통신 이상: ");
        pnlCtlrTitle.add(label3, 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, 8, 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));
        btnImage = new JButton();
        Font btnImageFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, btnImage.getFont());
        if (btnImageFont != null) btnImage.setFont(btnImageFont);
        btnImage.setText("정지영상");
        pnlControl.add(btnImage, new GridConstraints(0, 7, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, 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));
        btnInitialize = new JButton();
        Font btnInitializeFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, btnInitialize.getFont());
        if (btnInitializeFont != null) btnInitialize.setFont(btnInitializeFont);
        btnInitialize.setText("초기화");
        pnlControl.add(btnInitialize, 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));
        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("제어기 명칭");
        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(100, -1), new Dimension(100, -1), new Dimension(100, -1), 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.setIcon(new ImageIcon(getClass().getResource("/static/image/select.png")));
        label4.setText("선택한 제어기 ");
        pnlControl.add(label4, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, 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, 300), new Dimension(-1, 300), new Dimension(-1, 300), 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 label5 = new JLabel();
        Font label5Font = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, label5.getFont());
        if (label5Font != null) label5.setFont(label5Font);
        label5.setHorizontalAlignment(2);
        label5.setIcon(new ImageIcon(getClass().getResource("/static/image/logging.png")));
        label5.setText("시스템 로그");
        pnlLogTitle.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));
        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 label6 = new JLabel();
        label6.setIcon(new ImageIcon(getClass().getResource("/static/image/on.png")));
        label6.setText(" ");
        pnlStatusBar.add(label6, 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 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("  CPU 사용율(%):");
        pnlStatusBar.add(label7, 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 label8 = new JLabel();
        Font label8Font = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, label8.getFont());
        if (label8Font != null) label8.setFont(label8Font);
        label8.setHorizontalAlignment(0);
        label8.setHorizontalTextPosition(0);
        label8.setText("  메모리 사용율(%):");
        pnlStatusBar.add(label8, 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;
    }

}
