const express = require('express');
const path = require('path');
const bcrypt = require('bcryptjs');
const session = require('express-session');
const mysql = require('mysql2');
const app = express();

// การตั้งค่าการเชื่อมต่อกับฐานข้อมูล
    const pool = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'proj3'
});

// ตั้งค่า view engine เป็น EJS
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));

// ใช้ session สำหรับเก็บข้อมูลของผู้ใช้
app.use(session({
    secret: 'your-secret-key',
    resave: false,
    saveUninitialized: true,
}));

// ให้บริการไฟล์จากโฟลเดอร์ public
app.use(express.static(path.join(__dirname, 'public')));

// รับข้อมูลจากฟอร์ม
app.use(express.urlencoded({ extended: true }));

// หน้าแรก
app.get('/', (req, res) => {
    res.render('home');
});

// หน้า home (เปิดให้ทุกคนเข้าถึงได้)
app.get('/home', (req, res) => {
    res.render('home');
});

// หน้า login
app.get('/login', (req, res) => {
    res.render('login');
});

// ตรวจสอบการ login
app.post('/login', (req, res) => {
    const { username, password } = req.body;
    const query = 'SELECT * FROM users WHERE username = ?';

    pool.query(query, [username], (err, results) => {
        if (err) return res.send('Error occurred while logging in');
        if (results.length > 0) {
            bcrypt.compare(password, results[0].password, (err, isMatch) => {
                if (err) return res.send('Error occurred while comparing password');
                if (isMatch) {
                    req.session.username = username;
                    req.session.user_id = results[0].id;
                    res.redirect('/products');
                } else {
                    res.render('login', { error: 'รหัสผ่านไม่ถูกต้อง' });
                }
            });
        } else {
            res.render('login', { error: 'ไม่พบผู้ใช้' });
        }
    });
});

// หน้า register
app.get('/register', (req, res) => {
    res.render('register');
});

// สมัครสมาชิก
app.post('/register', (req, res) => {
    const { username, password, email } = req.body;
    bcrypt.hash(password, 10, (err, hashedPassword) => {
        if (err) return res.send('Error occurred while registering');
        const query = 'INSERT INTO users (username, password, email) VALUES (?, ?, ?)';
        pool.query(query, [username, hashedPassword, email], (err, result) => {
            if (err) return res.send('Error occurred while registering');
            res.redirect('/login');
        });
    });
});

// หน้า products
app.get('/products', (req, res) => {
    if (!req.session.username || !req.session.user_id) return res.redirect('/login');

    // ดึงข้อมูลบล็อกที่เกี่ยวข้องกับ user_id
    const query = `
        SELECT blogs.*, tags.name AS tag_name
        FROM blogs
        LEFT JOIN tags ON blogs.tag_id = tags.id
        WHERE blogs.user_id = ?
    `;
    pool.query(query, [req.session.user_id], (err, blogs) => {
        if (err) return res.send('เกิดข้อผิดพลาดในการดึงบล็อก');
        res.render('products', { blogs, username: req.session.username });
    });
});

// หน้า create-blog
app.get('/create-blog', (req, res) => {
    if (!req.session.username) return res.redirect('/login');

    // ดึงข้อมูล tags จากฐานข้อมูล
    const query = 'SELECT * FROM tags';
    pool.query(query, (err, tags) => {
        if (err) return res.send('เกิดข้อผิดพลาดในการดึงข้อมูลแท็ก');
        res.render('create-blog', { tags });
    });
});

// /อัปเดต blog
app.post('/create-blog', (req, res) => {
    const { title, content, tag_id } = req.body;
    if (!req.session.user_id) return res.redirect('/login');

    const query = 'INSERT INTO blogs (title, content, user_id, tag_id) VALUES (?, ?, ?, ?)';
    pool.query(query, [title, content, req.session.user_id, tag_id], (err, result) => {
        if (err) return res.send('เกิดข้อผิดพลาดในการสร้างบล็อก');
        res.redirect('/products');
    });
});

// ลบบล็อก
app.get('/delete-blog/:id', (req, res) => {
    const blogId = req.params.id;
    const query = 'DELETE FROM blogs WHERE id = ? AND user_id = ?';
    pool.query(query, [blogId, req.session.user_id], (err, result) => {
        if (err) return res.send('Error occurred while deleting blog');
        res.redirect('/products');
    });
});

// แก้ไขบล็อก (GET)
app.get('/edit-blog/:id', (req, res) => {
    const blogId = req.params.id;
    const query = `
        SELECT blogs.*, tags.name AS tag_name, tags.id AS tag_id
        FROM blogs
        LEFT JOIN tags ON blogs.tag_id = tags.id
        WHERE blogs.id = ? AND blogs.user_id = ?
    `;
    pool.query(query, [blogId, req.session.user_id], (err, result) => {
        if (err) return res.send('เกิดข้อผิดพลาดในการดึงข้อมูลบล็อก');
        if (result.length > 0) {
            const blog = result[0];
            const tagsQuery = 'SELECT * FROM tags';
            pool.query(tagsQuery, (err, tags) => {
                if (err) return res.send('เกิดข้อผิดพลาดในการดึงข้อมูลแท็ก');
                res.render('edit-blog', { blog, tags });
            });
        } else {
            res.send('ไม่พบบล็อก');
        }
    });
});

// แก้ไขบล็อก (POST)
app.post('/edit-blog/:id', (req, res) => {
    const blogId = req.params.id;
    const { title, content, tag_id } = req.body;
    const query = 'UPDATE blogs SET title = ?, content = ?, tag_id = ? WHERE id = ?';
    pool.query(query, [title, content, tag_id, blogId], (err, result) => {
        if (err) return res.send('เกิดข้อผิดพลาดในการแก้ไขบล็อก');
        res.redirect('/products');
    });
});

// ค้นหา blog
app.get('/search-blog', (req, res) => {
    const searchQuery = req.query.query;
    const sql = 'SELECT * FROM blogs WHERE title LIKE ? OR content LIKE ?';
    pool.query(sql, [`%${searchQuery}%`, `%${searchQuery}%`], (err, results) => {
        if (err) return res.status(500).json({ error: 'เกิดข้อผิดพลาด' });
        res.json(results);
    });
});

app.listen(3000, () => console.log('Server Running on port 3000'));