const pool = require('../config/database');
const bcrypt = require('bcryptjs');
class Tour {
    static async getAll() {
        try {
            const [results] = await pool.query('SELECT * FROM tours');
            return results;
        } catch (err) {
            throw err; // Throw error to be caught by the caller
        }
    }

    static async getById(id) {
        try {
            const [result] = await pool.query('SELECT * FROM tours WHERE id = ?', [id]);
            return result;
        } catch (err) {
            throw err;
        }
    }

    static async create(data) {
        try {
            const [result] = await pool.query('INSERT INTO tours SET ?', data);
            return result.insertId; // Return the ID of the newly inserted tour
        } catch (err) {
            throw err;
        }
    }

    static async update(id, data) {
        try {
            const [result] = await pool.query('UPDATE tours SET ? WHERE id = ?', [data, id]);
            return result.affectedRows > 0; // Return true if update was successful
        } catch (err) {
            throw err;
        }
    }

    static async delete(id) {
        try {
            const [result] = await pool.query('DELETE FROM tours WHERE id = ?', [id]);
            return result.affectedRows > 0; // Return true if delete was successful
        } catch (err) {
            throw err;
        }
    }

    static async search(query) {
        try {
            const [results] = await pool.query('SELECT * FROM tours WHERE name LIKE ?', [`%${query}%`]);
            return results;
        } catch (err) {
            throw err;
        }
    }
}

class User {
    static async findOne(email) {
        try {
            const [rows] = await pool.query('SELECT * FROM users WHERE email = ?', [email]);
            return rows.length > 0 ? rows[0] : null;
        } catch (err) {
            throw err;
        }
    }

    static async create(name, email, password) {
        try {
            const hashedPassword = await bcrypt.hash(password, 10);
            const [result] = await pool.query(
                'INSERT INTO users (name, email, password) VALUES (?, ?, ?)',
                [name, email, hashedPassword]
            );
            return result.insertId;
        } catch (err) {
            throw err;
        }
    }

    static async comparePassword(email, password) {
        try {
            const user = await User.findOne(email);
            if (!user) return false;
            return await bcrypt.compare(password, user.password);
        } catch (err) {
            throw err;
        }
    }
}

module.exports = { User, Tour };