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 javabean.Base;
import javabean.DateTime;
import javabean.Util;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * Servlet 实现类，用于获取图书馆借阅数据
 *
 * 该 Servlet 用于管理员查看过去30天内每天的借阅数量，并返回相应的借阅数据和日期。
 */
@WebServlet("/admin/libraryData")
public class LibraryData extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * 处理 GET 请求，获取图书馆借阅数据
	 *
	 * 该方法查询过去30天内的借阅数据，统计每天的借阅次数，并返回日期和对应的借阅数量。
	 *
	 * @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");

		// 初始化数据库连接、SQL语句、JSON 数据
		Connection connection = null;
		PreparedStatement pstmt = null;
		ResultSet resultSet = null;
		String sql = "";
		JSONObject jsonObject = new JSONObject();
		JSONArray jsonData = new JSONArray();
		JSONArray jsonDays = new JSONArray();

		// 返回参数：状态码、消息、数据
		int code = 1;
		String msg = "error";
		int count = 0;

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

		// 开始查询，获取过去30天的借阅数据
		try {
			connection = Base.getConnection();  // 获取数据库连接
			int i = 30;  // 查询过去30天的数据
			while (i != 0) {
				i--;
				sql = "select count(*) as count from borrow_books where date_format(borrow_date,'%Y-%m-%d')=? order by id desc";
				String date = DateTime.showDate(-i);  // 获取当前日期的前i天
				String md = DateTime.showMD(-i);  // 获取当前日期的前i天的月日格式（MM-dd）
				pstmt = connection.prepareStatement(sql);
				pstmt.setString(1, date);  // 设置日期参数
				resultSet = pstmt.executeQuery();

				while (resultSet.next()) {
					// 将借阅数量和日期分别添加到 JSON 数组中
					jsonData.add(resultSet.getString("count"));
					jsonDays.add(md);
				}
			}

			// 将查询结果放入 JSON 对象中
			jsonObject.put("data", jsonData);
			jsonObject.put("days", jsonDays);

			// 判断查询结果是否为空
			if (!jsonObject.isEmpty()) {
				code = 0;  // 状态码为 0 表示成功
				msg = "查询成功";
			} else {
				msg = "数据为空";
			}
		} catch (ClassNotFoundException e) {
			msg = "数据库连接失败";
			e.printStackTrace();
		} catch (SQLException e) {
			msg = "SQL 错误";
		} finally {
			// 关闭数据库连接和资源
			try {
				Base.closeResource(connection, pstmt, resultSet);
			} catch (SQLException e) {
				msg = "关闭数据库资源失败";
			}
		}

		// 返回 JSON 响应
		out.print(Util.jsonResponse(code, msg, jsonObject.toString()));
	}
}
