require('dotenv').config(); // โหลดค่าตัวแปรจากไฟล์ .env

const express = require('express');
const mysql = require('mysql2/promise');
const bcrypt = require('bcryptjs');
const session = require('express-session');
const cookieParser = require('cookie-parser');

const app = express(); // ต้องมีการสร้าง express app

// Middleware สำหรับ parse cookie และ JSON
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());

// Session configuration
app.use(session({
    secret: process.env.DB_SESSION || 'melon',
    resave: false,
    saveUninitialized: true,
    cookie: {
        secure: process.env.NODE_ENV === 'production', // secure เมื่อเป็น production mode
        httpOnly: true, // ป้องกันการเข้าถึงผ่าน JavaScript
        maxAge: 1000 * 60 * 60 * 24 // อายุของ session (1 วัน)
    }
}));

// Database configuration
const pool = mysql.createPool({
    host: process.env.DB_HOST || "10.104.20.74",
    port: process.env.DB_PORT || "3306",
    user: process.env.DB_USER || "root",
    password: process.env.DB_PASSWORD || "TNSypb73606",
    database: process.env.DB_NAME || "project",
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
});

// ทดสอบการเชื่อมต่อกับฐานข้อมูล
pool.getConnection()
    .then(connection => {
        console.log('✅ Database connected successfully!');
        connection.release();
    })
    .catch(err => {
        console.error('❌ Database connection failed:', err);
        process.exit(1); // หยุดโปรแกรมหากเชื่อมต่อไม่สำเร็จ
    });

// ตัวอย่าง route ทดสอบ
app.get('/', (req, res) => {
    if (req.session.user) {
        res.sendFile(path.join(__dirname, 'public', 'index.html'));
    } else {
        res.redirect('/login');
    }
});

const path = require('path');
app.use(express.static(path.join(__dirname, 'public')));

app.get('/login', (req, res) => {
    res.sendFile(path.join(__dirname, 'public', 'login.html'));
});

app.get('/register', (req, res) => {
    res.sendFile(path.join(__dirname, 'public', 'register.html'));
});



app.post('/register', async (req, res) => {
    const { email, password } = req.body;

    if (!email || !password) {
        return res.status(400).json({ error: 'All fields are required' });
    }

    try {
        // ตรวจสอบว่า email มีอยู่แล้วหรือไม่
        const [existingUser] = await pool.query(
            'SELECT * FROM users WHERE email = ?',
            [email]
        );

        if (existingUser.length > 0) {
            return res.status(400).json({ error: 'Email already exists' });
        }

        // เข้ารหัสรหัสผ่านด้วย bcryptjs
        const hashedPassword = await bcrypt.hash(password, 10);

        // เพิ่มข้อมูลลงฐานข้อมูล (ใช้แค่ email และ password)
        await pool.query(
            'INSERT INTO users (email, password) VALUES (?, ?)',
            [email, hashedPassword]
        );

        // หลังจากสมัครเสร็จแล้ว Redirect ไปหน้า Login
        res.redirect('/login');
    } catch (error) {
        console.error('❌ Registration failed:', error);
        res.status(500).json({ error: 'Registration failed' });
    }
});


// Route สำหรับการล็อกอิน
app.post('/login', async (req, res) => {
    const { email, password } = req.body;  // ใช้ email แทน user
    try {
        const connection = await pool.getConnection();
        // ค้นหาผู้ใช้จาก email
        const [rows] = await connection.query(
            'SELECT * FROM users WHERE email = ?',
            [email]
        );
        connection.release();
  
        if (rows.length > 0) {
            // ตรวจสอบรหัสผ่าน
            const match = await bcrypt.compare(password, rows[0].password);
            if (match) {
                // เก็บข้อมูลผู้ใช้ใน session (แค่ user_id และ email)
                req.session.user = {
                    id: rows[0].user_id,     // user_id ของผู้ใช้
                    email: rows[0].email     
                };
                console.log("User session:", req.session.user);  // เพิ่ม console log เพื่อตรวจสอบ
                res.redirect('/');  // ไปที่หน้า home หรือหน้าแรกหลังจากล็อกอิน
                return;
            } else {
                res.status(400).send('Invalid password');
                return;
            }
        } else {
            res.status(400).send('User not found');
            return;
        }
    } catch (err) {
        console.error('Login error:', err);
        res.status(500).send('Login failed');
        return;
    }
  });
  
  // API สำหรับดึงข้อมูลผู้ใช้หลังจากล็อกอิน
  app.get('/api/getUser', (req, res) => {
    if (req.session.user) {
        res.json({
            user_id: req.session.user.id,  // ส่งข้อมูล user_id จาก session
            email: req.session.user.email  // ส่งข้อมูล email จาก session
        });
    } else {
        res.status(401).send('User not logged in');
    }
  });
  

app.use(express.json()); // สำหรับการ parse ข้อมูลแบบ JSON
app.use(express.urlencoded({ extended: true })); // สำหรับการ parse ข้อมูลแบบ URL-encoded


app.post('/logout', (req, res) => {
    req.session.destroy(err => {
        if (err) {
            console.error('❌ Logout failed:', err);
            return res.status(500).json({ error: 'Logout failed' });
        }

        res.clearCookie('connect.sid');
        res.status(200).json({ message: 'Logout successful' });
    });
});


const isAuthenticated = (req, res, next) => {
    if (req.session.user) {
        next();
    } else {
        res.status(401).json({ error: 'Unauthorized' });
    }
};

app.get('/dashboard', isAuthenticated, (req, res) => {
    res.status(200).json({ message: `Welcome ${req.session.user.username}` });
});

// Start the server
const port = process.env.PORT || 3000;
app.listen(port, () => {
    console.log(`🚀 Server started on port ${port}`);
});