package com.cn.dao.impl; // 定义包名

import java.sql.*; // 导入SQL相关的类
import java.util.*; // 导入集合相关的类

import com.cn.dao.TrainDao; // 导入TrainDao接口
import com.cn.domain.Train; // 导入Train实体类
import com.cn.util.JDBCUtil; // 导入JDBC工具类

/**
 * TrainDao的实现类，提供列车数据访问操作。
 */
public class TrainDaoImpl implements TrainDao {
    private Connection conn = null; // 数据库连接对象
    private PreparedStatement pstmt = null; // 预编译语句对象
    private ResultSet rs = null; // 结果集对象

    @Override
    public int add(Train train) throws SQLException { // 添加列车信息的方法
        String sql = "insert into train (trainnumber,startstation,endstation,starttime,endtime,price,seatnumber,addtime) values (?,?,?,?,?,?,?,?)";
        conn = JDBCUtil.getConnection(); // 从JDBC工具类获取数据库连接
        pstmt = conn.prepareStatement(sql); // 准备SQL插入语句
        pstmt.setObject(1, train.getTrainNumber()); // 设置列车编号参数
        pstmt.setObject(2, train.getStartStation()); // 设置起始站参数
        pstmt.setObject(3, train.getEndStation()); // 设置终点站参数
        pstmt.setObject(4, train.getStartTime()); // 设置起始时间参数
        pstmt.setObject(5, train.getEndTime()); // 设置结束时间参数
        pstmt.setObject(6, train.getPrice()); // 设置价格参数
        pstmt.setObject(7, train.getSeatNumber()); // 设置座位数参数
        pstmt.setObject(8, train.getAddTime()); // 设置添加时间参数
        int recordNumber = pstmt.executeUpdate(); // 执行插入操作，并返回影响的行数
        closeResources(); // 关闭数据库资源
        return recordNumber;
    }

    @Override
    public int delete(Integer trainId) throws SQLException { // 根据列车ID删除列车信息的方法
        String sql = "delete from train where trainid=?";
        conn = JDBCUtil.getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setObject(1, trainId); // 设置列车ID参数
        int recordNumber = pstmt.executeUpdate(); // 执行删除操作，并返回影响的行数
        closeResources();
        return recordNumber;
    }

    @Override
    public int update(Train train) throws SQLException { // 更新列车信息的方法
        String sql = "update train set trainnumber=?,startstation=?,endstation=?,starttime=?,endtime=?,price=?,seatnumber=? where trainid=?";
        conn = JDBCUtil.getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setObject(1, train.getTrainNumber()); // 设置列车编号参数
        pstmt.setObject(2, train.getStartStation()); // 设置起始站参数
        pstmt.setObject(3, train.getEndStation()); // 设置终点站参数
        pstmt.setObject(4, train.getStartTime()); // 设置起始时间参数
        pstmt.setObject(5, train.getEndTime()); // 设置结束时间参数
        pstmt.setObject(6, train.getPrice()); // 设置价格参数
        pstmt.setObject(7, train.getSeatNumber()); // 设置座位数参数
        pstmt.setObject(8, train.getTrainId()); // 设置列车ID参数，用于更新条件
        int recordNumber = pstmt.executeUpdate(); // 执行更新操作，并返回影响的行数
        closeResources();
        return recordNumber;
    }

    @Override
    public List<Train> getAll() throws SQLException { // 获取所有列车信息的方法
        String sql = "select * from train";
        conn = JDBCUtil.getConnection();
        pstmt = conn.prepareStatement(sql);
        rs = pstmt.executeQuery(); // 执行查询操作
        List<Train> list = new ArrayList<>(); // 创建列车信息列表
        while (rs.next()) { // 遍历结果集
            int trainId = rs.getInt("trainId"); // 获取列车ID
            String trainNumber = rs.getString("trainNumber"); // 获取列车编号
            String startStation = rs.getString("startStation"); // 获取起始站
            String endStation = rs.getString("endStation"); // 获取终点站
            String startTime = rs.getString("startTime"); // 获取起始时间
            String endTime = rs.getString("endTime"); // 获取结束时间
            int price = rs.getInt("price"); // 获取价格
            int seatNumber = rs.getInt("seatNumber"); // 获取座位数
            Timestamp addTime = rs.getTimestamp("addTime"); // 获取添加时间
            Train train = new Train(trainId, trainNumber, startStation, endStation, startTime, endTime, price, seatNumber, addTime); // 创建列车对象
            list.add(train); // 添加列车对象到列表
        }
        closeResources(); // 关闭数据库资源
        return list; // 返回列车信息列表
    }

    @Override
    public Train getById(Integer trainId) throws SQLException { // 根据列车ID获取列车信息的方法
        String sql = "select * from train where trainid=?";
        conn = JDBCUtil.getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setObject(1, trainId); // 设置列车ID参数
        rs = pstmt.executeQuery(); // 执行查询操作
        Train train = null; // 初始化列车对象
        while (rs.next()) { // 遍历结果集
            String trainNumber = rs.getString("trainNumber"); // 获取列车编号
            String startStation = rs.getString("startStation"); // 获取起始站
            String endStation = rs.getString("endStation"); // 获取终点站
            String startTime = rs.getString("startTime"); // 获取起始时间
            String endTime = rs.getString("endTime"); // 获取结束时间
            int price = rs.getInt("price"); // 获取价格
            int seatNumber = rs.getInt("seatNumber"); // 获取座位数
            Timestamp addTime = rs.getTimestamp("addTime"); // 获取添加时间
            train = new Train(trainId, trainNumber, startStation, endStation, startTime, endTime, price, seatNumber, addTime); // 创建列车对象
        }
        closeResources(); // 关闭数据库资源
        return train; // 返回列车对象
    }

    @Override
    public List<Train> getByTrainNumber(String trainNumber) throws SQLException { // 根据列车编号获取列车信息列表的方法
        String sql = "select * from train where trainnumber=?";
        conn = JDBCUtil.getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setObject(1, trainNumber); // 设置列车编号参数
        rs = pstmt.executeQuery(); // 执行查询操作
        List<Train> list = new ArrayList<>(); // 创建列车信息列表
        while (rs.next()) { // 遍历结果集
            int trainId = rs.getInt("trainId"); // 获取列车ID
            String startStation = rs.getString("startStation"); // 获取起始站
            String endStation = rs.getString("endStation"); // 获取终点站
            String startTime = rs.getString("startTime"); // 获取起始时间
            String endTime = rs.getString("endTime"); // 获取结束时间
            int price = rs.getInt("price"); // 获取价格
            int seatNumber = rs.getInt("seatNumber"); // 获取座位数
            Timestamp addTime = rs.getTimestamp("addTime"); // 获取添加时间
            Train train = new Train(trainId, trainNumber, startStation, endStation, startTime, endTime, price, seatNumber, addTime); // 创建列车对象
            list.add(train); // 添加列车对象到列表
        }
        closeResources(); // 关闭数据库资源
        return list; // 返回列车信息列表
    }

    @Override
    public List<Train> getByStartEndStation(String startStation, String endStation, String startTime) throws SQLException { // 根据起始站、终点站和起始时间获取列车信息列表的方法
        String sql = "select * from train where startStation=? and endStation=? and startTime like \"%\"?\"%\"";
        conn = JDBCUtil.getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setObject(1, startStation); // 设置起始站参数
        pstmt.setObject(2, endStation); // 设置终点站参数
        pstmt.setObject(3, startTime); // 设置起始时间参数
        rs = pstmt.executeQuery(); // 执行查询操作
        List<Train> list = new ArrayList<>(); // 创建列车信息列表
        while (rs.next()) { // 遍历结果集
            int trainId = rs.getInt("trainId"); // 获取列车ID
            String trainNumber = rs.getString("trainNumber"); // 获取列车编号
            String endTime = rs.getString("endTime"); // 获取结束时间
            int price = rs.getInt("price"); // 获取价格
            int seatNumber = rs.getInt("seatNumber"); // 获取座位数
            Timestamp addTime = rs.getTimestamp("addTime"); // 获取添加时间
            Train train = new Train(trainId, trainNumber, startStation, endStation, startTime, endTime, price, seatNumber, addTime); // 创建列车对象
            list.add(train); // 添加列车对象到列表
        }
        closeResources(); // 关闭数据库资源
 			return list; // 返回列车信息列表
 		}
@Override
public List<Train> getAllStartStation() throws SQLException { // 获取所有不同的起始站的方法
    String sql = "select distinct startstation from train"; // SQL查询，选择不同的起始站
    conn = JDBCUtil.getConnection(); // 从JDBC工具类获取数据库连接
    pstmt = conn.prepareStatement(sql); // 准备SQL查询语句
    rs = pstmt.executeQuery(); // 执行查询操作
    List<Train> list = new ArrayList<>(); // 创建列车信息列表
    while (rs.next()) { // 遍历结果集
        String startStation = rs.getString("startStation"); // 获取起始站
        Train train = new Train(); // 创建列车对象
        train.setStartStation(startStation); // 设置列车对象的起始站
        list.add(train); // 将列车对象添加到列表
    }
    closeResources(); // 关闭数据库资源
    return list; // 返回列车信息列表
}

@Override
		public List<Train> getAllEndStation() throws SQLException { // 获取所有不同的终点站的方法
    		String sql = "select distinct endstation from train"; // SQL查询，选择不同的终点站
   	 		conn = JDBCUtil.getConnection(); // 从JDBC工具类获取数据库连接
    		pstmt = conn.prepareStatement(sql); // 准备SQL查询语句
    		rs = pstmt.executeQuery(); // 执行查询操作
    		List<Train> list = new ArrayList<>(); // 创建列车信息列表
    		while (rs.next()) { // 遍历结果集
        		String endStation = rs.getString("endStation"); // 获取终点站
        		Train train = new Train(); // 创建列车对象
        		train.setEndStation(endStation); // 设置列车对象的终点站
        		list.add(train); // 将列车对象添加到列表
    		}
    		closeResources(); // 关闭数据库资源
    		return list; // 返回列车信息列表
		}

		// 关闭数据库资源的方法
		private void closeResources() {
    		if (rs != null) {
        		try {
            		rs.close(); // 关闭结果集
        		} catch (SQLException e) {
            		e.printStackTrace();
        		}
    		}
    		if (pstmt != null) {
        		try {
            		pstmt.close(); // 关闭预编译语句
        		} catch (SQLException e) {
            		e.printStackTrace();
        		}
    		}
    		if (conn != null) {
        		try {
            		conn.close(); // 关闭数据库连接
        		} catch (SQLException e) {
            		e.printStackTrace();
        		}
    		}
		}
}