const express = require("express");
const mysql = require("mysql");
const bcrypt = require("bcryptjs");
const session = require("express-session");
const bodyParser = require("body-parser");
const path = require("path");
const { render } = require("ejs");

const createError = require("http-errors");
const cookieParser = require("cookie-parser");
const logger = require("morgan");

const flash = require("express-flash");
const connection = require("./lib/db");

const indexRouter = require("./routes/index");
const usersRouter = require("./routes/users");
const tasksRouter = require("./routes/tasks");
// const loginRouter = require("./routes/login");

require('dotenv').config()
const app = express();

// MySQL Connection
const db = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "",
  database: "work_collections",
});

db.connect((err) => {
  if (err) throw err;

  console.log("MySQL Connected...");
});

//Setup middleware
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, "public")));
app.use(
  session({
    cookie: { maxAge: 60000 },
    // store: new session.MemoryStore(),
    saveUninitialized: true, //บันทึก session แม้ยังไม่มีข้อมู
    resave: false,
    secret: "secret",
  })
);

app.use(flash());
// กำหนดให้ express สามารถเข้าถึงไฟล์ static (เช่น รูปภาพ, CSS, JS)
app.use(express.static(path.join(__dirname, "public")));

app.use("/", indexRouter);
app.use("/users", usersRouter);
app.use("/tasks", tasksRouter);

//Set EJS as Template engine
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));

// Middleware to check if the user is logged in
function isAuthenticated(req, res, next) {
  if (req.session.user) {
    //มีการ login เข้ามา
    return next(); //เรียกใช้ฟังก์ชั่น next
  } else {
    res.redirect("/login"); //ถ้าไม่ได้ล็อคอิน จะไปที่หน้า login
  }
}

function ifLoggedIn(req, res, next) {
  if (req.session.user) {
    return res.redirect("/home");
  }
  next();
}


// ฟังก์ชันแปลง Position เป็น Department
function getDepartment(position) {
  const departmentMap = {
    education: "กลุ่มงานสนับสนุนการพัฒนาศักยภาพนิสิตเพื่อการแข่งขันได้",
    manage:
      "กลุ่มงานสนับสนุนการบริหารงานและการบริการวิชาการมุ่งสู่ความเป็นเลิศ",
    analysis:
      "กลุ่มงานสนับสนุนการบริหารงานและการบริการวิชาการมุ่งสู่ความเป็นเลิศ",
    research:
      "กลุ่มงานสนับสนุนการบริหารงานและการบริการวิชาการมุ่งสู่ความเป็นเลิศ",
    computer: "กลุ่มงานสนับสนุนการบริหารระบบโครงสร้างพื้นฐาน",
    accountant:
      "กลุ่มงานสนับสนุนการบริหารสินทรัพย์เน้นหลักประสิทธิผลและความคุ้มค่า",
    supply:
      "กลุ่มงานสนับสนุนการบริหารสินทรัพย์เน้นหลักประสิทธิผลและความคุ้มค่า",
    technician: "กลุ่มงานสนับสนุนการบริหารระบบโครงสร้างพื้นฐาน",
  };
  return departmentMap[position] || "ไม่ระบุหน่วยงาน";
}

//Routes
app.get("/", (req, res) => {
  res.render("index", { user: req.session.user });
});

app.get("/login", ifLoggedIn, (req, res) => {
  res.render("login");
});

app.get("/logout", (req, res) => {
  req.session.destroy();
  res.redirect("/home");
});

//GET Route
app.get("/register", ifLoggedIn, (req, res) => {
  res.render("register");
});

app.get("/home", isAuthenticated, (req, res) => {
  console.log(req.session.user);
  res.render("home", { user: req.session.user });
});

//POST Route
app.post("/register", (req, res) => {
  const { name, username, email, password, position } = req.body;

  const checkEmailQuery = "SELECT * FROM users WHERE email = ?";
  db.query(checkEmailQuery, [email], (err, result) => {
    if (err) throw err;

    if (result.length > 0) {
      return res.render("register", {
        error_msg: "มี Email นี้ในระบบแล้ว โปรดใช้ Email อื่น",
      });
    }

    const hashedPassword = bcrypt.hashSync(password, 10);
    const insertUserQuery =
      "INSERT INTO users (name, username, email, password, position) VALUES(?, ?, ?, ?, ?)";

    db.query(
      insertUserQuery,
      [name, username, email, hashedPassword, position],
      (err, result) => {
        if (err) throw err;

        // เพิ่มข้อมูลลงในตาราง employee
        const userId = result.insertId; // ID ของ user ที่พึ่งสมัคร
        const department = getDepartment(position); // แปลงตำแหน่งเป็น department

        const insertEmployeeQuery =
          "INSERT INTO employee (user_id, full_name, department) VALUES (?, ?, ?)";
        db.query(insertEmployeeQuery, [userId, name, department], (err) => {
          if (err) throw err;
          res.render("register", { success_msg: "ลงทะเบียนสำเร็จ!" });
        });
      }
    );
  });
});


app.post("/login", (req, res) => {
  const { user_input, password } = req.body;
const bcrypt = require('bcrypt');

const plainPassword = '';  // รหัสผ่านที่ผู้ใช้ป้อน
const saltRounds = 10;  // จำนวน salt rounds (ระบุความยาก)

bcrypt.hash(plainPassword, saltRounds, function(err, hash) {
    if(err) throw err;
    // บันทึก hash ลงในฐานข้อมูลแทนที่ hashed_password
});
  const sql = "SELECT * FROM users WHERE username = ? OR email = ?";
  db.query(sql, [user_input, user_input], (err, result) => {
    if (err) throw err;

    if (result.length > 0) {
      const user = result[0];
      if (bcrypt.compareSync(password, user.password)) {
        req.session.user = user; // เก็บข้อมูลผู้ใช้ใน session
        res.redirect("/home");
      } else {
        res.render("login", { error_msg: "Incorrect password!" });
      }
    } else {
      res.render("login", { error_msg: "User not found!" });
    }
  });
});

app.listen(3000, () => {
  console.log("Server running on port 3000");
});