package com.cn.servlet; // 定义Servlet所在的包名

import java.io.IOException; // 导入IOException，用于处理输入输出异常
import java.io.PrintWriter; // 导入PrintWriter，用于向客户端发送字符文本数据
import java.sql.Timestamp; // 导入Timestamp类，用于处理数据库时间戳
import java.util.Date; // 导入Date类，用于处理日期

import javax.servlet.ServletException; // 导入ServletException，用于处理Servlet运行时的异常
import javax.servlet.http.HttpServlet; // 导入HttpServlet，是所有HTTP servlet的父类
import javax.servlet.http.HttpServletRequest; // 导入HttpServletRequest，代表客户端的请求信息
import javax.servlet.http.HttpServletResponse; // 导入HttpServletResponse，代表服务器对客户端的响应
import javax.servlet.http.HttpSession; // 导入HttpSession，代表与客户端的会话

import com.cn.domain.Member; // 导入Member类，该类定义了会员的数据结构
import com.cn.domain.Pmember; // 导入Pmember类，该类定义了会员个人信息的数据结构
import com.cn.domain.Prep; // 导入Prep类，该类定义了订单的数据结构
import com.cn.domain.Train; // 导入Train类，该类定义了车次的数据结构
import com.cn.service.PmemberService; // 导入PmemberService接口，该接口定义了会员个人信息服务的方法
import com.cn.service.PrepService; // 导入PrepService接口，该接口定义了订单服务的方法
import com.cn.service.TrainService; // 导入TrainService接口，该接口定义了车次服务的方法
import com.cn.service.impl.PmemberServiceImpl; // 导入PmemberService接口的实现类，用于具体的会员个人信息业务操作
import com.cn.service.impl.PrepServiceImpl; // 导入PrepService接口的实现类，用于具体的订单业务操作
import com.cn.service.impl.TrainServiceImpl; // 导入TrainService接口的实现类，用于具体的车次业务操作

/**
 * BookingServlet类，用于处理会员订票的请求。
 * @ClassName: BookingServlet 类名：BookingServlet
 * @Description: 会员实现订票功能的Servlet
 * @author: ljy Servlet的作者
 * @date: 2019年9月17日 下午11:23:41 Servlet创建的日期和时间
 */
public class BookingServlet extends HttpServlet {
	private static final long serialVersionUID = 1L; // 用于序列化

    /**
     * 默认构造函数。
     */
    public BookingServlet() {
        super(); // 调用父类的构造函数
        // TODO Auto-generated constructor stub
    }

	/**
	 * 处理GET请求的方法，用于显示订票页面。
	 * @param request HttpServletRequest对象，包含客户端的请求信息
	 * @param response HttpServletResponse对象，包含服务器对客户端的响应信息
	 * @throws ServletException 抛出Servlet异常
	 * @throws IOException 抛出输入输出异常
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 获取当前会话
		HttpSession session = request.getSession();
		// 从会话中获取会员对象
		Member member = (Member) session.getAttribute("member");

		// 从请求中获取车次ID
		Integer trainId = (Integer) request.getAttribute("trainId");
		// 创建车次服务对象
		TrainService trainService = new TrainServiceImpl();
		// 根据车次ID获取车次对象
		Train train = trainService.getById(trainId);
		// 根据会员ID获取会员个人信息服务对象
		Integer memberId = member.getMemberId(); // 从Session中获取会员ID
		PmemberService pmemberService = new PmemberServiceImpl();
		// 根据会员ID获取会员个人信息对象
		Pmember pmember = pmemberService.getPmemberByMemberId(memberId);
		
		// 将车次对象和会员个人信息对象设置到请求中，以便在JSP页面中使用
		request.setAttribute("train", train);
		request.setAttribute("pmember", pmember);
		// 转发请求到订票页面
		request.getRequestDispatcher("pages/user/booking.jsp").forward(request, response);

	}

	/**
	 * 处理POST请求的方法，用于处理会员订票的请求。
	 * @param request HttpServletRequest对象，包含客户端的请求信息
	 * @param response HttpServletResponse对象，包含服务器对客户端的响应信息
	 * @throws ServletException 抛出Servlet异常
	 * @throws IOException 抛出输入输出异常
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 从请求中获取车次ID，并转换为Integer类型
		Integer trainId = Integer.valueOf(request.getParameter("trainId"));
		// 创建车次服务对象
		TrainService trainService = new TrainServiceImpl();
		// 根据车次ID获取车次对象
		Train train = trainService.getById(trainId);
		// 从会话中获取会员对象
		Member member = (Member) request.getSession().getAttribute("member");	// 从Session中获取会员对象
		// 获取会员ID
		Integer memberId = member.getMemberId();	
		// 创建会员个人信息服务对象
		PmemberService pmemberService = new PmemberServiceImpl();
		// 根据会员ID获取会员个人信息对象
		Pmember pmember = pmemberService.getPmemberByMemberId(memberId);
		
		// 创建订单对象
		Prep prep = new Prep();
		// 设置订单属性
		prep.setTrainId(train.getTrainId());
		prep.setPmemberId(pmember.getPmemberId());
		prep.setStartStation(train.getStartStation());
		prep.setEndStation(train.getEndStation());
		prep.setTrainNumber(train.getTrainNumber());
		prep.setStartTime(train.getStartTime());
		prep.setEndTime(train.getEndTime());
		prep.setPrice(train.getPrice());
		prep.setWay(false);
		prep.setBooktime(new Timestamp(new Date().getTime())); // 设置订票时间为当前时间
		
		// 创建订单服务对象
		PrepService prepService = new PrepServiceImpl();
		// 调用订单服务添加订单，并返回影响的记录数
		int recordNumber = prepService.add(prep);
		
		// 获取PrintWriter对象，用于向客户端发送响应
		PrintWriter out = response.getWriter();
		if(recordNumber == 1) {
			// 如果订单添加成功，更新车次的座位数量
			train.setSeatNumber(train.getSeatNumber()-1);
			trainService.update(train);
			
			// 获取会话对象
			HttpSession session = request.getSession();
			// 检查是否是改签业务
			String flag = (String) session.getAttribute("changePrep");
			if(flag != null && !"".equals(flag) && "true".equals(flag)) {
				// 如果是改签业务，修改会话属性，表示改签结束
				session.setAttribute("changePrep", "false");
				// 向客户端发送JavaScript代码，弹出提示并跳转到我的订单页面
				out.write("<script>alert('改签成功！');" + "window.location.href='MyPrepServlet'</script>");
			} 
			// 向客户端发送JavaScript代码，弹出提示并跳转到车次查询页面
			out.write("<script>alert('订票成功！');" + "window.location.href='GetByStartEndStationServlet'</script>");
			
		} else {
			// 如果订单添加失败，向客户端发送JavaScript代码，弹出提示并跳转到车次查询页面
			out.write("<script>alert('很抱歉，订票失败！');" + "window.location.href='GetByStartEndStationServlet'</script>");
		}
		
		// 关闭PrintWriter对象
		out.close();
	}

}