package servlet.admin;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import javabean.Base;
import javabean.Util;
import net.sf.json.JSONObject;

/**
 * Servlet 用于管理员密码修改操作。
 *
 * 该 Servlet 处理管理员请求修改密码的操作，要求提供原密码、新密码以及确认密码。
 * 在成功验证原密码后，更新密码并返回相应的操作结果。
 */
@WebServlet("/admin/updatePassword")
public class UpdatePassword extends HttpServlet {

	/**
	 * 处理 POST 请求，执行密码更新操作
	 *
	 * 该方法接受原密码、新密码和确认密码，验证原密码是否正确，若正确则更新密码。
	 *
	 * @param req 请求对象
	 * @param resp 响应对象
	 * @throws ServletException 如果发生 Servlet 错误
	 * @throws IOException 如果发生 I/O 错误
	 */
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 设置响应类型为 JSON
		resp.setContentType("application/json; charset=utf8");

		// 接收请求参数
		String oldPassword = req.getParameter("oldPassword");
		String newPassword = req.getParameter("newPassword");
		String conPassword = req.getParameter("conPassword");

		// 获取当前登录用户的用户名
		HttpSession session = req.getSession();
		String username = (String) session.getAttribute("admin");

		// 准备数据库操作的变量
		Connection connection = null;
		PreparedStatement pstmt = null;
		ResultSet resultSet = null;
		int result = 0;
		String sql = null;
		int count = 0;

		// 准备返回数据
		int code = 1;  // 默认为失败
		String msg = "error";  // 默认为错误信息
		JSONObject json = new JSONObject();
		PrintWriter out = resp.getWriter();

		// 检查新密码和确认密码是否一致
		if (conPassword.equals(newPassword)) {
			// 查询数据库验证原密码
			try {
				connection = Base.getConnection();
				// 验证原密码是否正确
				sql = "select count(*) as count from admin where username=? and password=?";
				pstmt = connection.prepareStatement(sql);
				pstmt.setString(1, username);
				pstmt.setString(2, Util.passMd5(oldPassword));  // 对原密码进行 MD5 加密
				resultSet = pstmt.executeQuery();

				// 获取查询结果
				while (resultSet.next()) {
					count = resultSet.getInt("count");
				}

				// 如果原密码正确，进行密码更新
				if (count >= 1) {
					// 更新密码
					sql = "update admin set password=? where username=?";
					pstmt = connection.prepareStatement(sql);
					pstmt.setString(1, Util.passMd5(newPassword));  // 对新密码进行 MD5 加密
					pstmt.setString(2, username);
					result = pstmt.executeUpdate();

					// 判断密码是否更新成功
					if (result == 1) {
						code = 0;  // 成功
						msg = "修改成功";
					} else {
						msg = "修改失败";
					}

				} else {
					msg = "密码错误";  // 原密码不正确
				}

			} catch (ClassNotFoundException e) {
				msg = "class notfound";  // 类未找到错误
			} catch (SQLException e) {
				msg = "sql错误";  // SQL 错误
			} finally {
				// 关闭数据库资源
				try {
					Base.closeResource(connection, pstmt, resultSet);
				} catch (SQLException e) {
					msg = "关闭失败";  // 关闭数据库资源失败
				}
			}

		} else {
			msg = "两次密码不一致";  // 新密码和确认密码不一致
		}

		// 输出 JSON 格式的响应结果
		out.print(Util.jsonResponse(code, msg, null));
	}
}
