package com.msksbr.LoginFrm;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.msksbr.MainFrm.MainFrm;
import com.msksbr.SQL.Connector;
import com.msksbr.images.EasterEgg;

/**
 * LoginFrm 类表示登录窗口，用于用户登录到图书管理系统。
 */
public class LoginFrm extends javax.swing.JFrame {
    // 数据库连接器
    private final Connector connector;
    // 登录消息异常处理对象
    private final LoginMessangeExpection loginMessangeExpection;
    // 主面板
    private JPanel panel1;
    // 标题面板
    private JPanel titlePanel;
    // 标题标签
    private JLabel titleLabel;
    // 主体面板
    private JPanel bodyPanel;
    // 底部面板
    private JPanel bottomPanel;
    // 提交按钮
    private JButton commitButton;
    // 标签面板
    private JPanel labelPanel;
    // 字段面板
    private JPanel fieldPanel;
    // 用户名标签面板
    private JPanel uLabelPanel;
    // 密码标签面板
    private JPanel pLabelPanel;
    // 用户名标签
    private JLabel uLabel;
    // 密码标签
    private JLabel pLabel;
    // 用户名文本框
    private JTextField uField;
    // 密码文本框
    private JPasswordField pField;
    // 用户名
    private String username;
    // 密码
    private String password;

    /**
     * 构造函数，初始化登录窗口。
     */
    public LoginFrm() {
        // 初始化登录消息异常处理对象
        loginMessangeExpection = new LoginMessangeExpection();
        // 设置窗口图标
        setIconImage(new ImageIcon(LoginFrm.class.getResource("/com/msksbr/images/mainicon.png")).getImage());

        try {
            // 创建数据库连接器
            connector = new Connector();
        } catch (ClassNotFoundException | SQLException e) {
            // 抛出运行时异常
            throw new RuntimeException(e);
        }

        // 设置窗口标题
        setTitle("登录到图书管理系统");
        // 设置内容面板
        setContentPane(panel1);
        // 设置默认关闭操作
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 调整窗口大小以适应其内容
        pack();
        // 设置窗口可见
        setVisible(true);
        // 设置窗口大小
        setSize(400, 250);
        // 设置窗口不可调整大小
        setResizable(false);

        // 设置文本框的首选大小
        Dimension fieldDimension = new Dimension(250, 30);
        this.uField.setPreferredSize(fieldDimension);
        this.pField.setPreferredSize(fieldDimension);

        // 为密码文本框添加按键监听器
        this.pField.addKeyListener(new KeyAdapter() {
            /**
             * 当按键被按下时调用的方法。
             *
             * @param e 按键事件
             */
            @Override
            public void keyPressed(KeyEvent e) {
                // 如果按下的是回车键
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    // 调用登录消息输入方法
                    loginMessangeEntered();
                }
            }
        });

        // 设置提交按钮的光标为手型光标
        this.commitButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        // 为提交按钮添加动作监听器
        this.commitButton.addActionListener(new ActionListener() {
            /**
             * 当按钮被点击时调用的方法。
             *
             * @param e 动作事件
             */
            public void actionPerformed(ActionEvent e) {
                // 调用登录消息输入方法
                loginMessangeEntered();
            }
        });

        // 设置窗口位置
        setLocation();
        // 设置对话框位置
        setDialogLocation();
    }

    /**
     * 设置窗口位置为屏幕中心。
     */
    private void setLocation() {
        // 创建屏幕尺寸对象
        ScreenSize screenSize = new ScreenSize();
        // 设置窗口位置为屏幕中心
        setLocation(screenSize.width / 2 - getWidth() / 2, screenSize.height / 2 - getHeight() / 2);
    }

    /**
     * 设置对话框位置。
     */
    private void setDialogLocation() {
        // 设置对话框位置
        loginMessangeExpection.setLocation(getX() + getWidth() / 4, getY() + getHeight() / 4);
    }

    /**
     * 处理登录消息输入。
     */
    private void loginMessangeEntered() {
        // 获取用户名
        username = uField.getText();
        // 获取密码
        password = new String(pField.getPassword());
        // 检查登录消息是否正确
        Boolean ISMessageTrue = isLoginMessageTrue();
        if (ISMessageTrue) {
            // 关闭当前窗口
            dispose();
            try {
                // 创建主窗口
                new MainFrm();
            } catch (SQLException e) {
                // 抛出运行时异常
                throw new RuntimeException(e);
            } catch (ClassNotFoundException e) {
                // 抛出运行时异常
                throw new RuntimeException(e);
            }
        } else {
            // 显示登录消息异常对话框
            loginMessangeExpection.setVisible(true);
        }
    }

    /**
     * 检查登录消息是否正确。
     *
     * @return 如果登录消息正确返回 true，否则返回 false
     */
    private Boolean isLoginMessageTrue() {
        // 如果用户名和密码是特定的彩蛋值
        if (username.equals("java") && password.equals("beans")) {
            // 显示彩蛋对话框
            new EasterEgg();
            return false;
        } else {
            try {
                // 执行查询以检查用户名和密码是否匹配
                ResultSet resultSet = connector.executeQuery("SELECT * FROM users WHERE username = '" + username + "'");
                if (resultSet != null && resultSet.next()) { // 检查结果集是否不为空
                    if (resultSet.getString("password").equals(password)) {
                        return true;
                    }
                }
                return false;
            } catch (SQLException e) {
                // 抛出运行时异常
                throw new RuntimeException(e);
            }
        }
    }
}
