const db = require('../config/dbConfig');
const url = require('url');
const querystring = require('querystring');


exports.getRules = (req, res) => {
    const query = 'SELECT * FROM rules WHERE deleted = 0 ORDER BY rule_id DESC';

    // Execute the query
    db.query(query, (error, results) => {
        if (error) {
            res.status(500).json({ error: 'Internal Server Error' });
        } else {
            // Convert the results to JSON
            const jsonResult = JSON.stringify(results);
            // Send the JSON response

            res.json({ rules: jsonResult });
        }
    });
}

exports.getRule = (req, res) => {
    const query = 'SELECT * FROM rules where rule_id = ?';

    const parsedUrl = url.parse(req.originalUrl);
    const queryParams = querystring.parse(parsedUrl.query);

    db.query(query, [req.query.ruleId], (error, results) => {
        if (error) {
            res.status(500).json({ error: 'Internal Server Error' });
        } else {
            // Convert the results to JSON

            const jsonResult = JSON.stringify(results);

            // Send the JSON response
            res.json({ rules: jsonResult });
        }
    });
}

exports.deleteRule = (req, res) => {
    const query = 'UPDATE rules SET deleted = 1 where rule_id = ?';

    console.log("ruld to delete" + req.body.ruleID)
    db.query(query, [req.body.ruleID], (error, results) => {
        if (error) {
            res.status(500).json({ error: 'Internal Server Error' });
        } else {
            const jsonResult = JSON.stringify(results);
            res.json({ rules: jsonResult });
        }
    });
}

exports.publishRule = async (req, res) => {

    const edit = req.body.edit;

    if (!edit) {
        const publishQuery = "INSERT INTO rules "
            + "(rule_id, time_stamp, name, lineage, summary, modules, creator_name, creator_url, deleted, list, icon, latest_version, email)"
            + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

        db.query(publishQuery, [req.body.ruleID, req.body.timestamp, req.body.name, req.body.lineage, req.body.summary, req.body.modules, req.body.creatorName, req.body.creatorUrl, 0, req.body.list, req.body.icon, req.body.latest_version, req.body.email], (err, results) => {
            if (err) {
                console.error('Error executing query:', err);
                res.status(500).json({ success: false, message: 'OTP Validated but issue while creating entry for rule ' });
                return;
            }
            res.status(200).json({ success: true, message: 'OTP is valid and your rule is now published' });
        })
    } else {
        const publishQueryVersionHistory = "INSERT INTO version_history "
            + "(rule_id, time_stamp, name, lineage, summary, modules, creator_name, creator_url, list, icon, rule_version)"
            + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        const selectVersionHistory = "SELECT * FROM rules WHERE rule_id = ?"

        db.query(selectVersionHistory, [req.body.ruleID], (err, results) => {
            if (err) {
                console.error('Error executing query:', err);
                res.status(500).json({ success: false, message: 'Internal Server Error' });
                return;
            }
            console.log("rule    =>" + req.body.ruleID)
            if (results.length > 0) {

                const versionHistoryData = results[0];
                // Execute the second query to insert data
                db.query(
                    publishQueryVersionHistory,
                    [
                        versionHistoryData.rule_id,
                        versionHistoryData.time_stamp,
                        versionHistoryData.name,
                        versionHistoryData.lineage,
                        versionHistoryData.summary,
                        versionHistoryData.modules,
                        versionHistoryData.creator_name,
                        versionHistoryData.creator_url,
                        versionHistoryData.list,
                        versionHistoryData.icon,
                        req.body.latest_version - 1
                    ],
                    (err, insertResults) => {

                        if (err) {
                            console.log(err)
                            console.error('Error executing insert query:', err);
                            res.status(500).json({ success: false, message: 'Internal Server Error' });
                            return;
                        }
                        const updateQuery = "UPDATE rules SET time_stamp = ?, name = ?, lineage = ?, summary = ?, modules = ?, creator_name = ?, creator_url = ?, version = ?, list = ?, icon = ?, latest_version = ? WHERE rule_id = ?;"
                        db.query(updateQuery, [req.body.timestamp, req.body.name, req.body.lineage, req.body.summary, req.body.modules, req.body.creatorName, req.body.creatorUrl, req.body.version, req.body.list, req.body.icon, req.body.latest_version, req.body.ruleID], (err, results) => {
                            if (err) {
                                console.error('Error executing query:', err);
                                res.status(500).json({ success: false, message: 'OTP Validated but issue while creating entry for rule ' });
                                return;
                            }
                            res.status(200).json({ success: true, message: 'OTP is valid and your rule is now published' });
                        });
                    });
            }
        });
    }
}