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.get('/login', (req, res) => {
    res.sendFile(path.join(__dirname, 'public', 'login.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]
        );

        res.status(201).json({ message: 'User registered successfully' });
    } catch (error) {
        console.error('❌ Registration failed:', error);
        res.status(500).json({ error: 'Registration failed' });
    }
});

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

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

    try {
        // ค้นหาผู้ใช้จาก email
        const [user] = await pool.query(
            'SELECT * FROM users WHERE email = ?',
            [email]
        );

        if (user.length === 0) {
            return res.status(404).json({ error: 'User not found' });
        }

        // ตรวจสอบรหัสผ่าน
        const isMatch = await bcrypt.compare(password, user[0].password);

        if (!isMatch) {
            return res.status(401).json({ error: 'Invalid password' });
        }

        // สร้าง session ให้กับผู้ใช้
        req.session.user = {
            id: user[0].user_id,
            email: user[0].email
        };

        res.status(200).json({ message: 'Login successful', user: req.session.user });
    } catch (error) {
        console.error('❌ Login failed:', error);
        res.status(500).json({ error: 'Login failed' });
    }
});

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}`);
});