package servlet.admin;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.PreparedStatement;
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 java.sql.Connection;

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

/**
 * Servlet 实现类，用于管理员编辑书籍信息
 *
 * 该 Servlet 处理管理员编辑书籍信息的请求，更新数据库中的书籍信息。
 * 编辑成功后，返回包含成功状态的 JSON 响应；编辑失败则返回错误信息。
 */
@WebServlet("/admin/bookEdit")
public class BookEdit extends HttpServlet {

	/**
	 * 处理 POST 请求，执行书籍信息的编辑操作
	 *
	 * 该方法接收管理员提交的编辑请求，获取书籍 ID 以及更新后的信息，
	 * 然后执行更新操作。更新成功后返回成功的 JSON 响应；否则返回错误信息。
	 *
	 * @param req 请求对象
	 * @param resp 响应对象
	 * @throws ServletException 如果发生 Servlet 错误
	 * @throws IOException 如果发生 I/O 错误
	 */
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 设置响应内容类型为 JSON，字符编码为 UTF-8
		resp.setContentType("application/json; charset=utf8");

		// 获取请求中的参数：书籍 ID、书名、作者、馆藏 ID、分类 ID、位置、状态和描述
		String id = req.getParameter("id");
		String name = req.getParameter("name");
		String author = req.getParameter("author");
		String library_id = req.getParameter("library_id");
		String sort_id = req.getParameter("sort_id");
		String position = req.getParameter("position");
		String status = req.getParameter("status");
		String description = req.getParameter("description");

		// 打印描述信息进行调试
		System.out.println(description + "-------------");

		// 创建 JSON 对象用于响应数据
		JSONObject json = new JSONObject();

		// 声明数据库连接和 PreparedStatement 对象
		Connection connection = null;
		PreparedStatement pstmt = null;

		// 更新操作的执行结果
		int result = 0;

		// SQL 更新语句，更新指定 ID 的书籍信息
		String sql = "update books set name=? ,author=? ,library_id=? ,sort_id=? ,position=? ,status=?, description=? where id=?";

		// 获取响应输出流
		PrintWriter out = resp.getWriter();

		try {
			// 获取数据库连接
			connection = (Connection) Base.getConnection();

			// 创建 PreparedStatement 对象，设置 SQL 语句
			pstmt = connection.prepareStatement(sql);

			// 设置 SQL 语句中的参数
			pstmt.setString(1, name);
			pstmt.setString(2, author);
			pstmt.setString(3, library_id);
			pstmt.setString(4, sort_id);
			pstmt.setString(5, position);
			pstmt.setString(6, status);
			pstmt.setString(7, description);
			pstmt.setString(8, id);

			// 执行更新操作
			result = pstmt.executeUpdate();
		} catch (SQLException e) {
			// 捕获 SQL 异常（目前没有处理，打印错误信息）
		} catch (ClassNotFoundException e) {
			// 捕获类未找到异常
			e.printStackTrace();
		} finally {
			// 确保数据库资源被释放
			try {
				Base.closeResource(connection, pstmt, null);
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		// 判断更新操作是否成功
		if (result == 1) {
			// 更新成功，返回成功状态
			json.put("code", "0");
			json.put("msg", "success");
		} else {
			// 更新失败，返回失败状态
			json.put("code", "1");
			json.put("msg", "error");
		}

		// 将 JSON 响应数据写入输出流
		out.write(json.toString());
	}

	/**
	 * 处理 GET 请求，转发到 POST 请求处理逻辑
	 *
	 * @param req 请求对象
	 * @param resp 响应对象
	 * @throws ServletException 如果发生 Servlet 错误
	 * @throws IOException 如果发生 I/O 错误
	 */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
}
