package servlet.admin;

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

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

/**
 * Servlet 实现类，用于管理员获取借阅记录列表
 *
 * 该 Servlet 处理管理员请求借阅记录列表的操作，支持分页、条件查询。
 * 返回符合条件的借阅记录数据以及总数，并以 JSON 格式返回给客户端。
 */
@WebServlet("/admin/borrowList")
public class BorrowList extends HttpServlet {

	/**
	 * 处理 GET 请求，获取借阅记录列表
	 *
	 * 该方法接受分页、限制和查询条件的参数，查询数据库中的借阅记录数据，
	 * 并将查询结果以 JSON 格式返回给客户端。
	 *
	 * @param req 请求对象
	 * @param resp 响应对象
	 * @throws ServletException 如果发生 Servlet 错误
	 * @throws IOException 如果发生 I/O 错误
	 */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 设置响应内容类型为 JSON，字符编码为 UTF-8
		resp.setContentType("application/json; charset=utf8");

		// 获取分页、查询条件相关的参数
		String limit = req.getParameter("limit");    // 每页显示的记录数
		String page = req.getParameter("page");      // 当前页码
		String condition = (String) req.getParameter("condition");  // 查询条件（字段）
		String conditionValue = (String) req.getParameter("conditionValue");  // 查询条件值

		// 默认值处理：如果未传递分页参数，默认为第一页，默认每页 10 条记录
		if(page == null) {
			page = "1";
		}
		if(limit == null) {
			limit = "10";
		}

		// 准备 SQL 查询
		Connection connection = null;
		PreparedStatement pstmt = null;
		PreparedStatement countPstmt = null;
		ResultSet resultSet = null;
		ResultSet countSet = null;

		String sql = "select id, card_id, book_id, "
				+ "DATE_FORMAT(borrow_date, '%Y-%m-%d %k:%i:%s') as borrow_date, "
				+ "DATE_FORMAT(return_date, '%Y-%m-%d %k:%i:%s') as return_date, "
				+ "DATE_FORMAT(end_date, '%Y-%m-%d %k:%i:%s') as end_date, "
				+ "illegal, manager_id from borrow_books";  // 查询借阅记录的 SQL 语句

		String where = "";  // 记录条件过滤部分
		if(condition != null && conditionValue != null && !condition.isEmpty() && !conditionValue.isEmpty()) {
			// 如果传递了条件，构造 WHERE 语句进行过滤
			where = " where " + condition + " like '%" + conditionValue + "%' ";
			sql += where;
		} else if(condition != null && condition.equals("other")) {
			// 处理特殊的查询条件，例如逾期未还的记录
			where = " where return_date is null and curtime() > end_date ";
			sql += where;
		}

		// 添加分页查询的限制
		sql += " limit ?,?";

		// 准备返回参数
		int code = 1;  // 默认失败的状态码
		String msg = "error";  // 默认错误信息
		int count = 0;  // 总记录数

		JSONObject jsonData = new JSONObject();  // 存储单条借阅记录的 JSON 对象
		JSONArray jsonArray = new JSONArray();  // 存储所有借阅记录的 JSON 数组
		JSONObject jsonResult = new JSONObject();  // 最终返回的 JSON 对象

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

			// 执行查询操作，获取借阅记录数据
			pstmt = connection.prepareStatement(sql);
			pstmt.setInt(1, (Integer.parseInt(page) - 1) * Integer.parseInt(limit));  // 设置分页的起始位置
			pstmt.setInt(2, Integer.parseInt(limit));  // 设置分页的限制条数
			resultSet = pstmt.executeQuery();

			// 遍历查询结果，将每条借阅记录放入 JSON 数组中
			while(resultSet.next()) {
				jsonData.put("id", resultSet.getString("id"));
				jsonData.put("card_id", resultSet.getString("card_id"));
				jsonData.put("book_id", resultSet.getString("book_id"));
				jsonData.put("borrow_date", resultSet.getString("borrow_date"));
				jsonData.put("end_date", resultSet.getString("end_date"));
				jsonData.put("return_date", resultSet.getString("return_date"));
				jsonData.put("illegal", resultSet.getString("illegal"));
				jsonData.put("manager_id", resultSet.getString("manager_id"));
				jsonArray.add(jsonData);
			}

			// 查询符合条件的总记录数
			String countSql = "select count(*) as count from borrow_books " + where;
			countPstmt = connection.prepareStatement(countSql);
			countSet = countPstmt.executeQuery();
			if(countSet.next()) {
				count = countSet.getInt("count");
			}

			// 根据查询结果设置响应状态
			if(!jsonArray.isEmpty()) {
				code = 0;
				msg = "查询成功";
			} else {
				code = 0;
				msg = "没有数据";
			}

		} catch (ClassNotFoundException e) {
			msg = "class没找到";
		} catch (SQLException e) {
			msg = "sql错误";
		} finally {
			try {
				// 关闭数据库连接和相关资源
				Base.closeResource(null, pstmt, resultSet);
				Base.closeResource(connection, countPstmt, countSet);
			} catch (SQLException e) {
				msg = "关闭资源失败";
			}
		}

		// 构造返回的 JSON 数据
		jsonResult.put("code", code);
		jsonResult.put("count", count);
		jsonResult.put("msg", msg);
		jsonResult.put("data", jsonArray.toArray());  // 返回的借阅记录数据

		// 输出最终的 JSON 响应
		PrintWriter out = resp.getWriter();
		out.print(jsonResult.toString());
	}
}
