const express = require("express");
const mysql = require("mysql");
const http = require("http");
const fetch = require("isomorphic-fetch");
const multer = require("multer");
const bodyParser = require("body-parser");
var cors = require("cors");
const app = express();
const port = process.env.PORT || 8083;
const fs = require("fs");
const { exec } = require("child_process");

// const upload = multer({ dest: "uploads/" }); // Set the destination folder for uploaded files

app.use(cors());

let db = mysql.createPool({
    host: "localhost",
    user: "familpps_ashish",
    password: "Ashish@123",
    database: "familpps_superfly",
    // host: "localhost",
    // user: "root",
    // password: "",
    // database: "superfly",
});
const createdbConnection = () => {
    return db;
};

app.use(bodyParser.json({ limit: "50mb" }));
app.use(bodyParser.urlencoded({ limit: "50mb", extended: true }));
app.use(express.json());
// createdbConnection();
const createTableQuery = `
  CREATE TABLE IF NOT EXISTS user_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    unid VARCHAR(255),
    place_name VARCHAR(255) ,
    filename VARCHAR(255) ,
    mimetype VARCHAR(100) ,
    image_data LONGBLOB ,
    status VARCHAR(100) ,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  )
`;
// db.query(createTableQuery, (error, results, fields) => {
//     if (error) {
//         throw error;
//     }
//     console.log("Table created successfully");
// });

app.post(
    "/api/upload",
    multer({ dest: "uploads/" }).single("image"),
    (req, res) => {
        res.setHeader("Content-Type", "multipart/form-data");
        const { filename, mimetype, path } = req.file;
        const { id, place_name } = req.body;
        const status = "pending";

        const query = `INSERT INTO user_data (unid,place_name,filename, mimetype, image_data,status) VALUES (?,?,?, ?, ?,?)`;
        const values = [id, place_name, filename, mimetype, path, status];

        createdbConnection().query(query, values, (err, result) => {
            if (err) {
                console.error("Error saving image:", error);
                return res.sendStatus(500);
            } else {
                res.sendStatus(200);
            }
        });
    }
);

app.get("/api/fetchdb", (req, res) => {
    const query = `SELECT * FROM user_data`;

    createdbConnection().query(query, (err, result) => {
        if (err) {
            throw err;
        } else {
            res.status(200).json(result);
        }
    });
});
app.get("/api/superflystatus", (req, res) => {
    res.setHeader("Access-Control-Allow-Methods", "PUT");
    const { id } = req.query;
    console.log(req);

    const query = `SELECT * FROM user_data WHERE unid = ?`;
    const values = [id];
    createdbConnection().query(query, values, (err, result) => {
        if (err) {
            throw err;
        } else {
            res.status(200).json(result[0].status);
        }
    });
});

// Route handler for the update request
app.put("/api/update", (req, res) => {
    const { id, status } = req.body;

    console.log(status, id, req);

    const query = "UPDATE user_data SET status = ? WHERE unid = ?";
    const values = [status, id];
    createdbConnection().query(query, values, (err, result) => {
        if (err) {
            throw err;
        } else {
            res.send("Data updated successfully");
        }
    });
});

// ------------------------------ V2 ---------------------------
app.post(
    "/api/v2/upload",
    multer({ dest: "uploadsv2/" }).single("image"),
    (req, res) => {
        res.setHeader("Content-Type", "multipart/form-data");
        const { filename, path } = req.file;
        const { uuid, orderId, firstName, lastName, hatColor, patchType } =
            req.body;
        const status = "pending";

        const query = `INSERT INTO user_data_v2 (uuid,orderId,firstName,lastName,hatColor,patchType,filename,image_data,status) VALUES (?,?,?,?,?,?,?,?,?)`;
        const values = [
            uuid,
            orderId,
            firstName,
            lastName,
            hatColor,
            patchType,
            filename,
            path,
            status,
        ];

        createdbConnection().query(query, values, (err, result) => {
            if (err) {
                console.error("Error saving image:", error);
                return res.sendStatus(500);
            } else {
                res.sendStatus(200);
            }
        });
    }
);

app.get("/api/v2/fetchdb", (req, res) => {
    const query = `SELECT * FROM user_data_v2`;

    createdbConnection().query(query, (err, result) => {
        if (err) {
            throw err;
        } else {
            res.status(200).json(result);
        }
    });
});
app.get("/api/v2/superflystatus", (req, res) => {
    res.setHeader("Access-Control-Allow-Methods", "PUT");
    const { uuid } = req.query;

    const query = `SELECT * FROM user_data_v2 WHERE uuid = ?`;
    const values = [uuid];
    createdbConnection().query(query, values, (err, result) => {
        if (err) {
            throw err;
        } else {
            res.status(200).json(result[0].status);
        }
    });
});

// Route handler for the update request
// Function to update user data in the database
function updateUserData(id, status, callback) {
    const query = "UPDATE user_data_v2 SET status = ? WHERE id = ?";
    const values = [status, id];
    createdbConnection().query(query, values, (err, result) => {
        // connection.end(); // Always close the connection
        callback(err, result);
    });
}

// Function to execute a curl command
function notifyExternalAPI(uuid, callback) {
    console.log("I am in notify when completed");
    const curlCommand = `curl -X POST "https://brdg-f1-api.fly.dev/hat/${uuid}/order_complete" -H "Content-Type: application/json" -H "Authorization: Bearer sdgsd4wgOlJnNK890ulknlkh78sefjkFhk"`;
    exec(curlCommand, (error, stdout, stderr) => {
        if (error) {
            console.error(`exec error: ${error}`);
            callback(error, null);
            return;
        }
        console.log(`stdout: ${stdout}`);
        console.error(`stderr: ${stderr}`);
        callback(null, stdout);
    });
}

// Express route handler
app.put("/api/v2/update", (req, res) => {
    const { id, uuid, status } = req.body;

    updateUserData(id, status, (err, result) => {
        if (err) {
            console.error("Database error:", err);
            res.status(500).send("Database operation failed");
            return;
        }
        console.log("status", status);
        if (status === "completed")
            notifyExternalAPI(uuid, (error, response) => {
                if (error) {
                    res.status(500).send("Failed to notify external API");
                    return;
                }
                res.send("Data updated successfully and external API notified");
            });
    });
});

app.get("/", (req, res) => {
    res.send("hello, its Super Fly V2");
});

app.listen(port, () => {
    console.log(`Server listening on port ${port}`);
});
