const User = require("../models/User");
const bcrypt = require("bcryptjs");

// สร้างผู้ใช้ใหม่ (Create)
exports.createUser = async (req, res) => {
  try {
    // req.body = { first_name, last_name, email, password, role, ...}
    const newUser = await User.create(req.body);
    // ปกติจะไม่ส่งรหัสผ่านออกไปทั้งดุ้น ให้ปิดไปหรือเฉพาะ field ที่ต้องใช้
    res.status(201).json({
      message: "User created successfully",
      user: {
        user_id: newUser.user_id,
        first_name: newUser.first_name,
        last_name: newUser.last_name,
        email: newUser.email,
        role: newUser.role
      }
    });
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: "Error creating user", error: error.message });
  }
};

// อ่านข้อมูลผู้ใช้ทั้งหมด (Read All)
exports.getAllUsers = async (req, res) => {
  try {
    const users = await User.findAll({
      attributes: ['user_id', 'first_name', 'last_name', 'email', 'role', 'created_at']
    });
    res.status(200).json(users);
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: "Error retrieving users", error: error.message });
  }
};

// อ่านข้อมูลผู้ใช้รายคน (Read One)
exports.getUserById = async (req, res) => {
  const { id } = req.params;
  try {
    const user = await User.findByPk(id, {
      attributes: ['user_id', 'first_name', 'last_name', 'email', 'role', 'created_at']
    });
    if (!user) {
      return res.status(404).json({ message: "User not found" });
    }
    res.status(200).json(user);
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: "Error retrieving user", error: error.message });
  }
};

// อัปเดตข้อมูลผู้ใช้ (Update)
exports.updateUser = async (req, res) => {
  const { id } = req.params;
  try {
    // ถ้าต้องการ update password จะมี hook beforeUpdate จัดการ hash ให้
    const [rowsUpdated] = await User.update(req.body, { 
      where: { user_id: id },
      returning: true
    });

    if (!rowsUpdated) {
      return res.status(404).json({ message: "User not found or no change" });
    }
    // returning: true จะให้ Sequelize ส่งข้อมูลที่ update แล้วกลับมา (Postgres บางเวอร์ชัน)
    // ใน MySQL/MariaDB จะไม่ได้ผลแบบนี้ ต้อง findOne/findByPk อีกรอบ
    const updatedUser = await User.findByPk(id, {
      attributes: ['user_id', 'first_name', 'last_name', 'email', 'role', 'created_at', 'updated_at']
    });

    res.status(200).json({
      message: "User updated successfully",
      user: updatedUser
    });
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: "Error updating user", error: error.message });
  }
};

// ลบผู้ใช้ (Delete)
exports.deleteUser = async (req, res) => {
  const { id } = req.params;
  try {
    const rowsDeleted = await User.destroy({ where: { user_id: id } });
    if (!rowsDeleted) {
      return res.status(404).json({ message: "User not found" });
    }
    res.status(200).json({ message: "User deleted successfully" });
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: "Error deleting user", error: error.message });
  }
};
