package com.hrs.dao.impl;

import com.hrs.dao.UserDao;
import com.hrs.model.entity.User;
import com.hrs.util.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**   
* Copyright: Copyright (c) 2026 chinasofti
* 
* @ClassName: UserDaoImpl.java
* @Description: 用户数据访问实现类/负责用户表的增删改查操作
*
* @version: v1.0.0
* @author: 赵恒
* @date: 2026年4月13日 上午9:35:47 
*
* Modification History:
* Date         Author          Version            Description
*---------------------------------------------------------*
* 2026年4月13日     赵恒           v1.0.0               新建文件
*/
public class UserDaoImpl implements UserDao {
    /**
     * 
    * @Function: findByUsernameAndPassword
    * @Description: 根据用户名和密码查询用户（登录用）
    *
    * @param: username 用户名, password 密码
    * @return：User 用户对象，未找到返回null
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:40:00 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public User findByUsernameAndPassword(String username, String password) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;

        try {
            // 1. 获取连接
            conn = DBUtil.getConnection();

            // 2. 编写SQL（注意：实际项目密码应该是加密后比较，这里简化）
            String sql = "SELECT * FROM hrs_user WHERE user_name = ? AND password = ?";

            // 3. 创建预编译语句
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, username);
            pstmt.setString(2, password);  // 实际应该是MD5加密后比较

            // 4. 执行查询
            rs = pstmt.executeQuery();

            // 5. 处理结果集
            if (rs.next()) {
                user = resultSetToUser(rs);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6. 释放资源
            DBUtil.close(rs, pstmt, conn);
        }

        return user;
    }

    /**
     * 
    * @Function: findByUsername
    * @Description: 根据用户名查询用户（检查用户名是否已存在）
    *
    * @param: username 用户名
    * @return：User 用户对象，未找到返回null
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:40:30 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public User findByUsername(String username) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;

        try {
            conn = DBUtil.getConnection();
            String sql = "SELECT * FROM hrs_user WHERE user_name = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, username);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                user = resultSetToUser(rs);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, pstmt, conn);
        }

        return user;
    }
    /**
     * 
    * @Function: findByPhone
    * @Description: 根据手机号查询用户（检查手机号是否已注册）
    *
    * @param: phone 手机号
    * @return：User 用户对象，未找到返回null
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:41:00 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public User findByPhone(String phone) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;

        try {
            conn = DBUtil.getConnection();
            String sql = "SELECT * FROM hrs_user WHERE phone = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, phone);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                user = resultSetToUser(rs);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, pstmt, conn);
        }

        return user;
    }
    /**
     * 
    * @Function: findById
    * @Description: 根据ID查询用户
    *
    * @param: id 用户ID
    * @return：User 用户对象，未找到返回null
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:41:30 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public User findById(Long id) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;

        try {
            conn = DBUtil.getConnection();
            String sql = "SELECT * FROM hrs_user WHERE id = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setLong(1, id);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                user = resultSetToUser(rs);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, pstmt, conn);
        }

        return user;
    }
    /**
     * 
    * @Function: findAll
    * @Description: 查询所有用户（管理员用）
    *
    * @param: 无
    * @return：List<User> 用户列表
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:42:00 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public List<User> findAll() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        List<User> userList = new ArrayList<>();

        try {
            conn = DBUtil.getConnection();
            String sql = "SELECT * FROM hrs_user ORDER BY create_time DESC";
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();

            while (rs.next()) {
                userList.add(resultSetToUser(rs));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, pstmt, conn);
        }

        return userList;
    }

    /**
     * 
    * @Function: findAllTenants
    * @Description: 查询所有租客
    *
    * @param: 无
    * @return：List<User> 租客列表
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:42:30 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public List<User> findAllTenants() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        List<User> userList = new ArrayList<>();

        try {
            conn = DBUtil.getConnection();
            String sql = "SELECT * FROM hrs_user WHERE role_type = '0' ORDER BY create_time DESC";
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();

            while (rs.next()) {
                userList.add(resultSetToUser(rs));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, pstmt, conn);
        }

        return userList;
    }
    /**
     * 
    * @Function: findAllLandlords
    * @Description: 查询所有房东
    *
    * @param: 无
    * @return：List<User> 房东列表
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:43:00 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public List<User> findAllLandlords() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        List<User> userList = new ArrayList<>();

        try {
            conn = DBUtil.getConnection();
            String sql = "SELECT * FROM hrs_user WHERE role_type = '1' ORDER BY create_time DESC";
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();

            while (rs.next()) {
                userList.add(resultSetToUser(rs));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, pstmt, conn);
        }

        return userList;
    }

    /**
     * 
    * @Function: add
    * @Description: 添加用户（注册用）
    *
    * @param: user 用户对象
    * @return：boolean 是否成功
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:43:30 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public boolean add(User user) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        boolean success = false;

        try {
            conn = DBUtil.getConnection();
            String sql = "INSERT INTO hrs_user (user_name, password, real_name, phone, id_card, role_type, status, create_time) " +
                         "VALUES (?, ?, ?, ?, ?, ?, ?, NOW())";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, user.getUserName());
            pstmt.setString(2, user.getPassword());
            pstmt.setString(3, user.getRealName());
            pstmt.setString(4, user.getPhone());
            pstmt.setString(5, user.getIdCard());
            pstmt.setString(6, user.getRoleType());
            pstmt.setString(7, user.getStatus() != null ? user.getStatus() : "0"); // 默认未认证

            int rows = pstmt.executeUpdate();
            success = rows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(pstmt, conn);
        }

        return success;
    }

    /**
     * 
    * @Function: update
    * @Description: 更新用户信息
    *
    * @param: user 用户对象
    * @return：boolean 是否成功
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:44:00 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public boolean update(User user) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        boolean success = false;

        try {
            conn = DBUtil.getConnection();
            String sql = "UPDATE hrs_user SET real_name=?, phone=?, id_card=?, status=?, update_time=NOW() WHERE id=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, user.getRealName());
            pstmt.setString(2, user.getPhone());
            pstmt.setString(3, user.getIdCard());
            pstmt.setString(4, user.getStatus());
            pstmt.setLong(5, user.getId());

            int rows = pstmt.executeUpdate();
            success = rows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(pstmt, conn);
        }

        return success;
    }
    /**
     * 
    * @Function: updateStatus
    * @Description: 更新用户状态（启用/禁用）
    *
    * @param: userId 用户ID, status 状态
    * @return：boolean 是否成功
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:44:30 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public boolean updateStatus(Long userId, String status) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        boolean success = false;

        try {
            conn = DBUtil.getConnection();
            String sql = "UPDATE hrs_user SET status=?, update_time=NOW() WHERE id=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, status);
            pstmt.setLong(2, userId);

            int rows = pstmt.executeUpdate();
            success = rows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(pstmt, conn);
        }

        return success;
    }

    /**
     * 
    * @Function: delete
    * @Description: 删除用户（物理删除，一般不建议）
    *
    * @param: id 用户ID
    * @return：boolean 是否成功
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:45:00 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public boolean delete(Long id) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        boolean success = false;

        try {
            conn = DBUtil.getConnection();
            String sql = "DELETE FROM hrs_user WHERE id=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setLong(1, id);

            int rows = pstmt.executeUpdate();
            success = rows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(pstmt, conn);
        }

        return success;
    }

    /**
     * 
    * @Function: count
    * @Description: 统计用户总数
    *
    * @param: 无
    * @return：int 用户总数
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:45:30 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    @Override
    public int count() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        int count = 0;

        try {
            conn = DBUtil.getConnection();
            String sql = "SELECT COUNT(*) FROM hrs_user";
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                count = rs.getInt(1);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, pstmt, conn);
        }

        return count;
    }


    /**
     * 
    * @Function: resultSetToUser
    * @Description: 将ResultSet转换为User对象
    *
    * @param: rs 结果集
    * @return：User 用户对象
    * @throws：SQLException
    *
    * @version: v1.0.0
    * @author: 赵恒
    * @date: 2025年4月13日 下午3:46:00 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月13日     赵恒           			v1.0.0                             新建方法
     */
    private User resultSetToUser(ResultSet rs) throws SQLException {
        User user = new User();
        user.setId(rs.getLong("id"));
        user.setUserName(rs.getString("user_name"));
        user.setPassword(rs.getString("password"));
        user.setRealName(rs.getString("real_name"));
        user.setPhone(rs.getString("phone"));
        user.setIdCard(rs.getString("id_card"));
        user.setRoleType(rs.getString("role_type"));
        user.setStatus(rs.getString("status"));
        user.setCreateBy(rs.getString("create_by"));
        user.setCreateTime(rs.getTimestamp("create_time"));
        user.setUpdateBy(rs.getString("update_by"));
        user.setUpdateTime(rs.getTimestamp("update_time"));
        return user;
    }
}
