import CheckPermission from "./CheckPermission.js";
import conn from "./Conn.js";

class Books {

    checkErrors(book) {
        const errors = [];

        if(book.author.length === 0
        || book.author === undefined
        || book.author === null){
            console.log(typeof(book));
            errors.push("A szerzőt kötelező beállítani!");
        }
            

        if(book.title.length === 0
        || book.title === undefined
        || book.title === null)
            errors.push("A könyv címét kötelező megadni!");
        
        if(book.publisher.length === 0
        || book.publisher === undefined
        || book.title === null)
            errors.push("A könyv kiadóját kötelező megadni!");    
        
        if(book.the_year_of_publishing === 0
        || book.the_year_of_publishing === undefined
        || book.the_year_of_publishing === null)
            errors.push("A könyv kiadásának évét kötelező megadni!");
        
        if(book.description.length === 0
        || book.description === undefined
        || book.description === null)
            errors.push("A könyv leírását kötelező megadni!");

        if(book.language.length === 0
        || book.language === undefined
        || book.language === null)
            errors.push("A könyv nyelvét kötelező megadni!");

        if(book.number_of_pages === 0
        || book.number_of_pages === undefined
        || book.number_of_pages === null)
            errors.push("A könyv terjedelmét kötelező megadni!");

        if(book.cover.length === 0
        || book.cover === undefined
        || book.cover === null)
            errors.push("A könyv borítójának típusát kötelező megadni!");

        if(book.cover.length === 0
        || book.cover === undefined
        || book.cover === null)
            errors.push("A könyv súlyát kötelező megadni!");
        
          if((!book.ISBN || book.ISBN.length === 0)
          || book.ISBN === undefined
          || book.ISBN === null)
              errors.push("A könyv ISBN számát kötelező megadni!");
        
        
        
        if(book.itemcode.length === 0
        || book.itemcode === undefined
        || book.itemcode === null)
            errors.push("A könyv termékkódját kötelező megadni!");
        
        if(book.price === 0
        || book.price === undefined
        || book.price === null)
            errors.push("A könyv árát kötelező megadni!");

        if(book.discounted_price === 0
        || book.discounted_price === undefined
        || book.discounted_price === null)
            errors.push("A könyv kedvezményes árát kötelező megadni!");

        if(book.categoryID === 0
        || book.categoryID === undefined
        || book.categoryID === null)
            errors.push("A könyv kategóriáját kötelező megadni!");
        
        return errors;
    }

    async serchBooks(char) {
        const sql = `SELECT * FROM books WHERE title LIKE ?`;
        const startingP = `${char}%`; 

        try {
            const data = await conn.promise().query(sql, [startingP]);

            if(data[0].length !== 0) {
                return {
                    status:200,
                    messages: data[0]
                };
            } else {
                return {
                    status: 404,
                    messages:["A keresett erőforrás nem található!"]
                };
            }
        } catch (err) {
            console.log(err);
            console.log(err.errno);
            console.log(err.sqlMessage);

            return {
                status:503,
                messages: ["A szolgáltatás jelenleg nem elérhető! Próbálja meg később!"]
            };
        }
    }
    
    async getBooksCatID(id) {
        const sql = `SELECT * FROM books WHERE categoryID = ?`;

        try {
            const data = await conn.promise().query(sql, [id]);

            if(data[0].length !== 0) {
                return {
                    status:200,
                    messages: data[0]
                };
            } else {
                return {
                    status:404,
                    messages:["A keresett erőforrás nem található!"]
                };
            }
        } catch(err) {
            console.log(err);
            console.log(err.errno);
            console.log(err.sqlMessage);

            return {
                status:503,
                messages: ["A szolgáltatás jelenleg nem elérhető! Próbálja meg később!"]
            };
        }
    }
    
    
    async getBook(id) {
        const sql = `SELECT * FROM books WHERE BookID = ?`;

        try {
            const data = await conn.promise().query(sql, [id]);

            if(data[0].length !== 0) {
                return {
                    status:200,
                    messages: data[0][0]
                };
            } else {
                return {
                    status:404,
                    messages:["A keresett erőforrás nem található!"]
                };
            }
        } catch(err) {
            console.log(err);
            console.log(err.errno);
            console.log(err.sqlMessage);

            return {
                status:503,
                messages:["A szolgáltatás jelenleg nem elérhető! Próbálja meg később!"]
            };
        }
    }

    async getBooks() {
        const sql = "SELECT * FROM books";

        try {
            const response = await conn.promise().query(sql);

            return {
                status:200,
                messages:response[0]
            }
        } catch(err) {
            console.log(err);
            console.log(err.errno);
            console.log(err.sqlMessage);

            return {
                status:503,
                messages:["A szolgáltatás jelenleg nem elérhető! Próbálja meg később!"]
            };
        }
    }

    async deleteBook(id, userID, isAdmin) {
        const sql = `DELETE FROM books WHERE BookID = ?`;

        if(!CheckPermission(userID, isAdmin, true)) {
            return {
                status:403,
                messages:["Nincs jogosultságod törölni a bejegyzést!"]
            }
        }

      

        try {
            const response = await conn.promise().query(sql, [id]);

            if(response[0].affectedRows === 1) {
                return {
                    status:200, //ha a status code 204 (No Content) nem tudok hozzá üzenetet beállítani, emiatt állítottam be a 200-at!
                    messages:"Sikeres törlés!"
                }
            } else {
                return {
                    status:404,
                    messages:"Az erőforrás nem található!"
                }
            }
        } catch(err) {
            console.log(err);
            console.log(err.errno);
            console.log(err.sqlMessage);

            return {
                status:503,
                messages:["A szolgáltatás jelenleg nem elérhető! Próbálja meg később!"]
            };
        }
    }

    async addBook(book, userID, isAdmin) {
        const sql = `INSERT INTO books (author, title, publisher, the_year_of_publishing,
            description, language, number_of_pages, cover, weight, ISBN, itemcode, price, discounted_price, book_url, categoryID)
            VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`;

        const errors = this.checkErrors(book);

        if(!CheckPermission(userID, isAdmin, true)) {
            return {
                status:403,
                messages:["Nincs jogosultságod létrehozni a bejegyzést!"]
            }
        }

        if(errors.length > 0) {
            console.log(errors);
            return {
                status:400,
                messages:errors
            }
        }
        
    

        try {
            const response = await conn.promise().query(sql,
            [
                
                book.author, 
                book.title,  
                book.publisher, 
                book.the_year_of_publishing, 
                book.description, 
                book.language, 
                book.number_of_pages, 
                book.cover, 
                book.weight, 
                book.ISBN, 
                book.itemcode, 
                book.price, 
                book.discounted_price, 
                book.book_url, 
                book.categoryID
             

            ]);

            return {
                status:200,
                messages:["Sikeres felvitel!"]
            }
        } catch(err) {
            console.log(err);
            console.log(err.errno);
            console.log(err.sqlMessage);

            return {
                status:503,
                messages:["A szolgáltatás jelenleg nem elérhető! Próbálja meg később!"]
            };
        }
    }

    async updateBook(book, userID, isAdmin) {
        const sql = `UPDATE books
        SET author = ?, title = ?,
        publisher = ?, the_year_of_publishing = ?,
        description = ?, language = ?, number_of_pages = ?,
        cover = ?, weight = ?, ISBN = ?, itemcode = ?, price = ?,
        discounted_price = ?, book_url = ?, categoryID = ? WHERE BookID = ?`;

        const errors = this.checkErrors(book);

        if(!CheckPermission(userID, isAdmin, true)) {
            return {
                status:403,
                messages:["Nincs jogosultságod felülírni a bejegyzést!"]
            }
        }

        if(errors.length > 0) {
            return {
                status:400,
                messages:errors
            }
        }

    

        try {
            const response = await conn.promise().query(sql,
            [
                book.author, 
                book.title, 
                book.publisher, 
                book.the_year_of_publishing, 
                book.description, 
                book.language, 
                book.number_of_pages, 
                book.cover, 
                book.weight, 
                book.ISBN, 
                book.itemcode, 
                book.price, 
                book.discounted_price, 
                book.book_url, 
                book.categoryID,
                book.bookID 

            ]);

            if(response[0].affectedRows === 1) {
                return {
                    status:200,
                    messages:["Sikeres felülírás"]
                }
            } else {
                return {
                status:404,
                messages:["A keresett könyv nem található!"]
                }
            }
        } catch (err) {
            console.log(err);
            console.log(err.errno);
            console.log(err.sqlMessage);

            return {
                status:503,
                messages:["A szolgáltatás jelenleg nem elérhető! Próbálja meg később!"]
            };
        }
    }
}

export default Books;