const BookModel = require('../models/bookModel');
const multer = require('multer');
const path = require('path');

exports.getBookLists = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    const bookModel = new BookModel(req.db);

    try {
        const lists = await bookModel.getListsByUser(req.session.user.user_id);
        res.render('booklists', { 
            lists,
            user_id: req.session.user.user_id 
        });
    } catch (error) {
        res.status(500).send('เกิดข้อผิดพลาดในการโหลดรายการหนังสือ');
    }
};

exports.postBookList = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    const { listname } = req.body;
    const bookModel = new BookModel(req.db);

    try {
        await bookModel.createList(listname, req.session.user.user_id);
        res.redirect('/booklists');
    } catch (error) {
        res.status(500).send('เกิดข้อผิดพลาดในการเพิ่มรายการหนังสือ');
    }
};

exports.getEditList = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    const { list_id } = req.params;
    const bookModel = new BookModel(req.db);

    try {
        const lists = await bookModel.getListsByUser(req.session.user.user_id);
        const currentList = lists.find(list => list.list_id == list_id);
        res.render('edit-booklist', { list: currentList });
    } catch (error) {
        res.status(500).send('เกิดข้อผิดพลาดในการโหลดข้อมูลรายการหนังสือ');
    }
};

exports.postEditList = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    const { list_id } = req.params;
    const { listname } = req.body;
    const bookModel = new BookModel(req.db);

    try {
        await bookModel.updateList(list_id, listname, req.session.user.user_id);
        res.redirect('/booklists');
    } catch (error) {
        res.status(500).send('เกิดข้อผิดพลาดในการแก้ไขรายการหนังสือ');
    }
};

exports.deleteBookList = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    const { list_id } = req.params;
    const bookModel = new BookModel(req.db);

    try {
        await bookModel.deleteList(list_id, req.session.user.user_id);
        res.redirect('/booklists');
    } catch (error) {
        res.status(500).send('เกิดข้อผิดพลาดในการลบรายการหนังสือ');
    }
};

exports.getBooks = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    const { list_id } = req.params;
    const bookModel = new BookModel(req.db);

    try {
        const books = await bookModel.getBooksByList(list_id);
        res.render('books', { books, list_id }); // เพิ่ม list_id
    } catch (error) {
        res.status(500).send('เกิดข้อผิดพลาดในการโหลดหนังสือ');
    }
};

exports.getAddBook = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }
    
    const { list_id } = req.params;
    res.render('addbook', { 
        list_id,
        isEditing: false,
        book: {
            bookname: '',
            author: '',
            category: '',
            type: '',
            image_url: ''
        }
    });
};

exports.postBook = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    const { bookname, author, category, type, list_id, image_url } = req.body;
    const bookModel = new BookModel(req.db);

    try {
        await bookModel.addBook(bookname, author, category, type, list_id, req.session.user.user_id, image_url);
        res.redirect(`/books/${list_id}`);
    } catch (error) {
        res.status(500).send('เกิดข้อผิดพลาดในการเพิ่มหนังสือ');
    }
};

exports.getEditBook = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    const { book_id } = req.params;
    const bookModel = new BookModel(req.db);

    try {
        const book = await bookModel.getBookByIdAndUser(book_id, req.session.user.user_id);
        
        if (!book) {
            return res.status(403).send('You do not have permission to edit this book');
        }

        res.render('addbook', {
            isEditing: true,
            book: book,
            list_id: book.list_id
        });
    } catch (error) {
        console.error('Error loading book:', error);
        res.status(500).send('Error loading book information');
    }
};

exports.postEditBook = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    upload(req, res, async (err) => {
        if (err) {
            return res.status(400).send('Error uploading file: ' + err.message);
        }

        try {
            const { book_id } = req.params;
            const { bookname, author, category, type, imageOption } = req.body;
            
            // First check if book exists and user has permission
            const bookModel = new BookModel(req.db);
            const existingBook = await bookModel.getBookByIdAndUser(book_id, req.session.user.user_id);
            
            if (!existingBook) {
                return res.status(403).send('You do not have permission to edit this book');
            }

            // Determine image URL
            let image_url = existingBook.image_url; // Keep existing image by default
            if (imageOption === 'file' && req.file) {
                image_url = `/uploads/${req.file.filename}`;
            } else if (imageOption === 'url' && req.body.image_url) {
                image_url = req.body.image_url;
            }

            // Update book
            await bookModel.updateBook(book_id, req.session.user.user_id, {
                bookname,
                author,
                category,
                type,
                image_url
            });

            res.redirect(`/books/${existingBook.list_id}`);
        } catch (error) {
            console.error('Error updating book:', error);
            res.status(500).send('Error updating book information');
        }
    });
};

exports.deleteBook = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    const { book_id } = req.params;
    const bookModel = new BookModel(req.db);

    try {
        // Get book info before deleting to know which list to redirect to
        const book = await bookModel.getBookById(book_id);
        if (!book || book.length === 0) {
            return res.status(404).send('ไม่พบหนังสือ');
        }

        const list_id = book[0].list_id;
        await bookModel.deleteBook(book_id, req.session.user.user_id);
        res.redirect(`/books/${list_id}`);
    } catch (error) {
        console.error('Error deleting book:', error);
        res.status(500).send('เกิดข้อผิดพลาดในการลบหนังสือ');
    }
};

exports.getBookInfo = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    const { book_id } = req.params;
    const bookModel = new BookModel(req.db);

    try {
        const [book] = await bookModel.getBookById(book_id);
        if (!book) {
            return res.status(404).send('Book not found');
        }
        res.render('bookinfo', { book });
    } catch (error) {
        res.status(500).send('Error loading book information');
    }
};
// Configure multer for file uploads
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, 'public/uploads/')
    },
    filename: (req, file, cb) => {
        cb(null, `${Date.now()}-${file.originalname}`)
    }
});

const upload = multer({ 
    storage: storage,
    limits: {
        fileSize: 5 * 1024 * 1024 // 5MB limit
    },
    fileFilter: (req, file, cb) => {
        const filetypes = /jpeg|jpg|png/;
        const mimetype = filetypes.test(file.mimetype);
        const extname = filetypes.test(path.extname(file.originalname).toLowerCase());

        if (mimetype && extname) {
            return cb(null, true);
        }
        cb(new Error('Only .png, .jpg and .jpeg format allowed!'));
    }
}).single('image_file');

exports.postBook = async (req, res) => {
    if (!req.session.user) {
        return res.redirect('/login');
    }

    upload(req, res, async (err) => {
        if (err) {
            console.error('Upload error:', err);
            return res.status(400).send('Error uploading file: ' + err.message);
        }

        try {
            const { bookname, author, category, type, list_id, imageOption } = req.body;
            let image_url = '';

            if (imageOption === 'file' && req.file) {
                image_url = `/uploads/${req.file.filename}`;
            } else {
                image_url = req.body.image_url;
            }

            const bookModel = new BookModel(req.db);
            await bookModel.createBook({
                bookname,
                author,
                category,
                type,
                image_url,
                list_id,
                user_id: req.session.user.user_id
            });

            res.redirect(`/books/${list_id}`);
        } catch (error) {
            console.error('Error creating book:', error);
            res.status(500).send('เกิดข้อผิดพลาดในการเพิ่มหนังสือ');
        }
    });
};