package com.iailab.netsdk.demo.frame.vto;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Panel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

import com.sun.jna.Memory;
import com.sun.jna.Pointer;

import com.iailab.netsdk.common.FunctionList;
import com.iailab.netsdk.common.PaintPanel;
import com.iailab.netsdk.common.Res;
import com.iailab.netsdk.demo.module.AlarmListenModule;
import com.iailab.netsdk.demo.module.GateModule;
import com.iailab.netsdk.demo.module.LoginModule;
import com.iailab.netsdk.demo.module.RealPlayModule;
import com.iailab.netsdk.demo.module.TalkModule;
import com.iailab.netsdk.lib.NetSDKLib;
import com.iailab.netsdk.lib.NetSDKLib.CtrlType;
import com.iailab.netsdk.lib.NetSDKLib.EM_OPEN_DOOR_TYPE;
import com.iailab.netsdk.lib.NetSDKLib.LLong;
import com.iailab.netsdk.lib.NetSDKLib.NET_CTRL_ACCESS_OPEN;
import com.iailab.netsdk.lib.ToolKits;

public class VTODemo extends JFrame {
    private static final long serialVersionUID = 1L;

    private JPanel contentPane;
    private JTextField ipTextField;
    private JTextField portTextField;
    private JTextField userNameTextField;
    private JPasswordField passwordField;
    private JTable alarmTable;

    private Panel realPlay;
    private PaintPanel imagePanel;
    private JButton btnLogin;
    private JButton btnLogout;
    private JButton btnRealPlay;
    private JButton btnStopplay;
    private JButton btnTalk;
    private JButton btnStoptalk;
    private JButton btnOpendoor;
    private JButton btnClosedoor;
    private JButton btnOperate;
    private JButton btnStartlisten;
    private JButton btnStoplisten;
    private JButton btnStartrealload;
    private JButton btnStoprealload;
    JTabbedPane tabbedPane;
    private static boolean b_RealPlay = false;
    private static boolean b_Attachment = false;
    private boolean isListen = false;

///////////////////// 主面板 /////////////////////

    private static JFrame mainFrame = new JFrame();
    private OperateManager manager = new OperateManager();

    private Object[][] alarmData;
    private Object[][] realData;

    private DefaultTableModel alarmModel;
    private DefaultTableModel realModel;

    private final String[] alarmTableTitle = {Res.string().getVTOAlarmEventRoomNo(),
            Res.string().getVTOAlarmEventCardNo(), Res.string().getVTOAlarmEventTime(),
            Res.string().getVTOAlarmEventOpenMethod(), Res.string().getVTOAlarmEventStatus()};
    private final String[] realTableTitle = {Res.string().getVTORealLoadRoomNO(), Res.string().getVTORealLoadCardNo(),
            Res.string().getVTORealLoadTime(), Res.string().getVTORealLoadEventInfo()};

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    VTODemo frame = new VTODemo();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public VTODemo() {
        // setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle(Res.string().getVTO());
        setBounds(100, 100, 920, 651);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        LoginModule.init(DefaultDisConnect.GetInstance(), DefaultHaveReconnect.getINSTANCE());
        JPanel panel = new JPanel();
        panel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), Res.string().getLogin(),
                TitledBorder.LEFT, TitledBorder.TOP, null, new Color(0, 0, 0)));
        panel.setBounds(0, 0, 905, 46);
        contentPane.add(panel);
        panel.setLayout(null);

        JLabel ipLabel = new JLabel(Res.string().getIp());
        ipLabel.setBounds(10, 15, 44, 21);
        panel.add(ipLabel);

        ipTextField = new JTextField();
        ipTextField.setText("10.34.3.63");
        ipTextField.setBounds(64, 15, 89, 21);
        panel.add(ipTextField);
        ipTextField.setColumns(10);

        JLabel portLabel = new JLabel(Res.string().getPort());
        portLabel.setBounds(174, 15, 44, 21);
        panel.add(portLabel);

        portTextField = new JTextField();
        portTextField.setText("37777");
        portTextField.setColumns(10);
        portTextField.setBounds(228, 15, 66, 21);
        panel.add(portTextField);

        JLabel lblName = new JLabel(Res.string().getUserName());
        lblName.setBounds(316, 15, 66, 21);
        panel.add(lblName);

        userNameTextField = new JTextField();
        userNameTextField.setText("admin");
        userNameTextField.setColumns(10);
        userNameTextField.setBounds(383, 15, 87, 21);
        panel.add(userNameTextField);

        JLabel lblPassword = new JLabel(Res.string().getPassword());
        lblPassword.setBounds(492, 15, 66, 21);
        panel.add(lblPassword);

        passwordField = new JPasswordField();
        passwordField.setBounds(568, 15, 112, 21);
        passwordField.setText("admin123");
        panel.add(passwordField);

        btnLogin = new JButton(Res.string().getLogin());
        btnLogin.setBounds(684, 14, 99, 23);
        panel.add(btnLogin);
        btnLogin.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                login();
            }
        });
        btnLogout = new JButton(Res.string().getLogout());
        btnLogout.setBounds(785, 14, 110, 23);
        panel.add(btnLogout);
        btnLogout.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                logout();
            }
        });
        JPanel previewPanel = new JPanel();
        previewPanel.setBorder(
                new TitledBorder(null, Res.string().getRealplay(), TitledBorder.LEFT, TitledBorder.TOP, null, null));
        previewPanel.setBounds(10, 56, 409, 313);
        contentPane.add(previewPanel);
        previewPanel.setLayout(new BorderLayout(0, 0));

        realPlay = new Panel();
        realPlay.setBackground(Color.GRAY);
        previewPanel.add(realPlay, BorderLayout.CENTER);

        JPanel operatePanel = new JPanel();
        operatePanel.setBorder(
                new TitledBorder(null, Res.string().getOperate(), TitledBorder.LEFT, TitledBorder.TOP, null, null));
        operatePanel.setBounds(429, 56, 452, 194);
        contentPane.add(operatePanel);
        operatePanel.setLayout(null);

        btnRealPlay = new JButton(Res.string().getStartRealPlay());
        btnRealPlay.setBounds(37, 23, 162, 29);
        operatePanel.add(btnRealPlay);
        btnRealPlay.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                realPlay();
            }
        });
        btnTalk = new JButton(Res.string().getStartTalk());
        btnTalk.setBounds(248, 23, 152, 29);
        operatePanel.add(btnTalk);
        btnTalk.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                talk();
            }
        });
        btnStopplay = new JButton(Res.string().getStopRealPlay());
        btnStopplay.setBounds(37, 62, 162, 29);
        operatePanel.add(btnStopplay);
        btnStopplay.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                stopPlay();
            }
        });
        btnStoptalk = new JButton(Res.string().getStopTalk());
        btnStoptalk.setBounds(248, 62, 152, 29);
        operatePanel.add(btnStoptalk);
        btnStoptalk.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                stopTalk();
            }
        });
        btnOpendoor = new JButton(Res.string().getDoorOpen());
        btnOpendoor.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                openDoor();
            }
        });
        btnOpendoor.setBounds(37, 110, 162, 29);
        operatePanel.add(btnOpendoor);

        btnClosedoor = new JButton(Res.string().getDoorClose());
        btnClosedoor.setBounds(37, 149, 162, 29);
        operatePanel.add(btnClosedoor);
        btnClosedoor.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                closeDoor();
            }
        });
        btnOperate = new JButton(Res.string().getCardOperate());
        btnOperate.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (manager == null) {
                    manager = new OperateManager();
                }
                manager.setVisible(true);
            }
        });
        btnOperate.setBounds(248, 125, 152, 29);
        operatePanel.add(btnOperate);

        JPanel eventOperate = new JPanel();
        eventOperate.setBorder(new TitledBorder(null, Res.string().getEventOperate(), TitledBorder.LEFT,
                TitledBorder.TOP, null, null));
        eventOperate.setBounds(429, 260, 452, 104);
        contentPane.add(eventOperate);
        eventOperate.setLayout(null);

        btnStartlisten = new JButton(Res.string().getStartListen());
        btnStartlisten.setBounds(35, 21, 178, 29);
        eventOperate.add(btnStartlisten);
        btnStartlisten.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                isListen = startListen();
                tabbedPane.setSelectedIndex(0);
            }
        });

        btnStoplisten = new JButton(Res.string().getStopListen());
        btnStoplisten.setBounds(35, 60, 178, 29);
        eventOperate.add(btnStoplisten);
        btnStoplisten.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //table清空数据
                ((DefaultTableModel) alarmTable.getModel()).setRowCount(0);
                stopListen();
            }
        });

        btnStartrealload = new JButton(Res.string().getStartRealLoad());
        btnStartrealload.setBounds(234, 21, 195, 29);
        eventOperate.add(btnStartrealload);
        btnStartrealload.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                startRealLoad();
                tabbedPane.setSelectedIndex(1);
            }
        });

        btnStoprealload = new JButton(Res.string().getStopRealLoad());
        btnStoprealload.setBounds(234, 60, 195, 29);
        eventOperate.add(btnStoprealload);
        btnStoprealload.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //清空table数据
                ((DefaultTableModel) realLoadTable.getModel()).setRowCount(0);
                stopRealLoad();
                //图片清空
                imagePanel.setImage(null);
                imagePanel.repaint();
            }
        });

        tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        tabbedPane.setBounds(10, 379, 871, 224);
        contentPane.add(tabbedPane);

        JPanel alarmPanel = new JPanel();
        alarmPanel.setBorder(
                new TitledBorder(null, Res.string().getEventInfo(), TitledBorder.LEFT, TitledBorder.TOP, null, null));
        tabbedPane.addTab(Res.string().getAlarmEvent(), null, alarmPanel, null);
        alarmPanel.setLayout(new BorderLayout(0, 0));

        alarmData = new Object[0][5];
        alarmTable = tableInit(alarmData, alarmTableTitle);
        alarmModel = (DefaultTableModel) alarmTable.getModel();
        JScrollPane scrollPane = new JScrollPane(alarmTable);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        alarmPanel.add(scrollPane, BorderLayout.CENTER);

        JPanel realLoadPanel = new JPanel();
        realLoadPanel.setBorder(new TitledBorder(null, Res.string().getVTORealLoadEventInfo(), TitledBorder.LEFT,
                TitledBorder.TOP, null, null));
        tabbedPane.addTab(Res.string().getRealLoadEvent(), null, realLoadPanel, null);
        realLoadPanel.setLayout(null);

        imagePanel = new PaintPanel();
        imagePanel.setBounds(671, 20, 185, 165);
        realLoadPanel.add(imagePanel);
        realData = new Object[0][4];
        realLoadTable = tableInit(realData, realTableTitle);
        realModel = (DefaultTableModel) realLoadTable.getModel();
        realScrollPane = new JScrollPane(realLoadTable);
        realScrollPane.setBounds(10, 20, 654, 165);
        realScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        realLoadPanel.add(realScrollPane);

        btnEnable(false);
        btnLogin.setEnabled(true);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                if (LoginModule.m_hLoginHandle.longValue() != 0) {
                    logout();
                }
                LoginModule.cleanup();
                dispose();
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        FunctionList demo = new FunctionList();
                        demo.setVisible(true);
                    }
                });
            }
        });
    }

    /**
     * 按钮使能
     *
     * @param enable
     */
    public void btnEnable(boolean enable) {
        btnLogin.setEnabled(enable);
        btnLogout.setEnabled(enable);
        btnRealPlay.setEnabled(enable);
        btnStopplay.setEnabled(enable);
        btnTalk.setEnabled(enable);
        btnStoptalk.setEnabled(enable);
        btnOpendoor.setEnabled(enable);
        btnClosedoor.setEnabled(enable);
        btnOperate.setEnabled(enable);
        btnStartlisten.setEnabled(enable);
        btnStoplisten.setEnabled(enable);
        btnStartrealload.setEnabled(enable);
        btnStoprealload.setEnabled(enable);
    }

    public JTable tableInit(Object[][] data, String[] columnName) {
        JTable table;
        DefaultTableModel model;
        model = new DefaultTableModel(data, columnName);
        table = new JTable(model) {
            @Override // 不可编辑
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        model = (DefaultTableModel) table.getModel();


        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 只能选中一行

        // 列表显示居中
        DefaultTableCellRenderer dCellRenderer = new DefaultTableCellRenderer();
        dCellRenderer.setHorizontalAlignment(JLabel.CENTER);
        table.setDefaultRenderer(Object.class, dCellRenderer);
        return table;
    }

    /**
     * 登录
     */
    public boolean login() {
        if (LoginModule.login(ipTextField.getText(), Integer.parseInt(portTextField.getText()),
                userNameTextField.getText(), new String(passwordField.getPassword()))) {
            btnEnable(true);
            btnLogin.setEnabled(false);
            // 监听按钮使能
            btnRealPlay.setEnabled(true);
            btnStopplay.setEnabled(false);
            btnStartlisten.setEnabled(true);
            btnStoplisten.setEnabled(false);
            btnStartrealload.setEnabled(true);
            btnStoprealload.setEnabled(false);
            btnTalk.setEnabled(true);
            btnStoptalk.setEnabled(false);
        } else {
            JOptionPane.showMessageDialog(null, Res.string().getLoginFailed() + ", " + ToolKits.getErrorCodeShow(),
                    Res.string().getErrorMessage(), JOptionPane.ERROR_MESSAGE);
            return false;
        }
        return true;
    }

    /**
     * 登出
     */
    public void logout() {
        if (b_RealPlay) {
            stopPlay();
        }
        if (TalkModule.m_hTalkHandle != null) {
            stopTalk();
        }
        if (isListen) {
            stopListen();
            isListen = false;
        }
        stopRealLoad();
        LoginModule.logout();
        btnEnable(false);
        //清空两个表格
        //普通事件table清空数据
        ((DefaultTableModel) alarmTable.getModel()).setRowCount(0);
        //智能事件table清空数据
        ((DefaultTableModel) realLoadTable.getModel()).setRowCount(0);
        //图片清空
        imagePanel.setImage(null);
        imagePanel.repaint();
        btnLogin.setEnabled(true);
    }

    private LLong m_hPlayHandle;

    public void realPlay() {
        if (!b_RealPlay) {
            m_hPlayHandle = RealPlayModule.startRealPlay(0, 0, realPlay);
            if (m_hPlayHandle.longValue() != 0) {
                b_RealPlay = true;
                btnRealPlay.setEnabled(false);
                btnStopplay.setEnabled(true);
            } else {
                JOptionPane.showMessageDialog(null, ToolKits.getErrorCodeShow(), Res.string().getErrorMessage(),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * 停止实时预览
     */
    public void stopPlay() {
        if (b_RealPlay) {
            RealPlayModule.stopRealPlay(m_hPlayHandle);
            realPlay.repaint();
            b_RealPlay = false;
            btnRealPlay.setEnabled(true);
            btnStopplay.setEnabled(false);
        }
    }

    /**
     * 对讲
     */
    public void talk() {
        if (TalkModule.startTalk(0, 0)) {
            btnTalk.setEnabled(false);
            btnStoptalk.setEnabled(true);
        } else {
            JOptionPane.showMessageDialog(null, ToolKits.getErrorCodeShow(), Res.string().getErrorMessage(),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * 停止对讲
     */
    public void stopTalk() {
        TalkModule.stopTalk();
        btnTalk.setEnabled(true);
        btnStoptalk.setEnabled(false);
    }

    /**
     * 开门
     */
    public void openDoor() {
        NET_CTRL_ACCESS_OPEN openInfo = new NET_CTRL_ACCESS_OPEN();
        openInfo.nChannelID = 0;
        openInfo.emOpenDoorType = EM_OPEN_DOOR_TYPE.EM_OPEN_DOOR_TYPE_REMOTE;

        Pointer pointer = new Memory(openInfo.size());
        ToolKits.SetStructDataToPointer(openInfo, pointer, 0);
        boolean ret = LoginModule.netsdk.CLIENT_ControlDeviceEx(LoginModule.m_hLoginHandle,
                CtrlType.CTRLTYPE_CTRL_ACCESS_OPEN, pointer, null, 10000);
        if (!ret) {
            JOptionPane.showMessageDialog(null, ToolKits.getErrorCodeShow(), Res.string().getErrorMessage(),
                    JOptionPane.ERROR_MESSAGE);
            return;
        }
    }

    /**
     * 关门
     */
    public void closeDoor() {
        final NetSDKLib.NET_CTRL_ACCESS_CLOSE close = new NetSDKLib.NET_CTRL_ACCESS_CLOSE();
        close.nChannelID = 0; // 对应的门编号 - 如何开全部的门
        close.write();
        Pointer pointer = new Memory(close.size());
        boolean result = LoginModule.netsdk.CLIENT_ControlDeviceEx(LoginModule.m_hLoginHandle,
                NetSDKLib.CtrlType.CTRLTYPE_CTRL_ACCESS_CLOSE, close.getPointer(), null, 5000);
        close.read();
        if (!result) {
            JOptionPane.showMessageDialog(null, ToolKits.getErrorCodeShow(), Res.string().getErrorMessage(),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * 监听事件
     */
    public boolean startListen() {
        if (AlarmListenModule.startListen(VTOMessageCallBack.getINSTANCE(alarmTable, null))) {
            btnStartlisten.setEnabled(false);
            btnStoplisten.setEnabled(true);
        } else {
            JOptionPane.showMessageDialog(null, ToolKits.getErrorCodeShow(), Res.string().getErrorMessage(),
                    JOptionPane.ERROR_MESSAGE);
            return false;
        }
        return true;
    }

    /**
     * 停止监听
     */
    public void stopListen() {
        if (isListen) {
            if (AlarmListenModule.stopListen()) {
                isListen = false;
                btnStartlisten.setEnabled(true);
                btnStoplisten.setEnabled(false);
            } else {
                JOptionPane.showMessageDialog(null, ToolKits.getErrorCodeShow(), Res.string().getErrorMessage(),
                        JOptionPane.ERROR_MESSAGE);
            }
        }

    }

    private LLong m_attachHandle;
    private JTable realLoadTable;
    private JScrollPane realScrollPane;

    /**
     * 智能事件监听
     */
    public void startRealLoad() {
        m_attachHandle = GateModule.realLoadPic(0, VTOAnalyzerCallBack.getINSTANCE(realLoadTable, imagePanel));
        if (m_attachHandle != null && m_attachHandle.longValue() != 0) {
            btnStartrealload.setEnabled(false);
            btnStoprealload.setEnabled(true);
        }
    }

    /**
     * 停止智能事件监听
     */
    public void stopRealLoad() {
        if (m_attachHandle != null && m_attachHandle.longValue() != 0) {
            GateModule.stopRealLoadPic(m_attachHandle);
            m_attachHandle.setValue(0);
            btnStartrealload.setEnabled(true);
            btnStoprealload.setEnabled(false);
        }

    }

}