"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SERVER_STATE = exports.BOT_STATE = void 0;
const express_1 = require("express");
const dockerService_1 = require("../services/dockerService");
const axios_1 = __importDefault(require("axios"));
var BOT_STATE;
(function (BOT_STATE) {
    BOT_STATE["EXISTS"] = "exists";
    BOT_STATE["NOT_EXISTS"] = "not_exists";
})(BOT_STATE = exports.BOT_STATE || (exports.BOT_STATE = {}));
var SERVER_STATE;
(function (SERVER_STATE) {
    SERVER_STATE["RUNNING"] = "running";
    SERVER_STATE["NOT_WORKING"] = "not_working";
})(SERVER_STATE = exports.SERVER_STATE || (exports.SERVER_STATE = {}));
const router = (0, express_1.Router)();
const getContainerApiUrl = (port) => {
    const baseUrl = process.env.CONTAINER_API_URL ? process.env.CONTAINER_API_URL : "http://localhost";
    const url = `${baseUrl}:${port}/`;
    return url;
};
// Obtener todos los contenedores
router.get("/", async (req, res) => {
    try {
        const containers = await (0, dockerService_1.listContainers)();
        res.json(containers);
    }
    catch (error) {
        res.status(500).json({ error: error.message });
    }
});
// Iniciar un contenedor por ID
router.post("/:id/start", async (req, res) => {
    try {
        const organizationId = req.params.id;
        const containerInfo = await (0, dockerService_1.getContainerByOrganization)(organizationId);
        await (0, dockerService_1.startContainer)(containerInfo.Id);
        res.json({ message: `El bot ${containerInfo.Id} ha sido iniciado` });
    }
    catch (error) {
        if (error.message.indexOf("already started") >= 0) {
            res.json({ message: `El bot se encontraba iniciado anteriormente.` });
            return;
        }
        res.status(500).json({ error: error.message });
    }
});
// Obtener el QR de conexion para el bot de una organization.
router.get("/:id/qr", async (req, res) => {
    try {
        const organizationId = req.params.id;
        const containerInfo = await (0, dockerService_1.getContainerByOrganization)(organizationId);
        const url = getContainerApiUrl(containerInfo.Ports[0].PublicPort.toString()); // "http://localhost:" + containerInfo.Ports[0].PublicPort + "/";
        const response = await axios_1.default.get(url, { responseType: "arraybuffer" });
        res.setHeader("Content-type", "image/png");
        res.send(response.data);
    }
    catch (error) {
        res.status(500).json({ error: error.message });
    }
});
// Detener un contenedor por ID
router.post("/:id/stop", async (req, res) => {
    try {
        const organizationId = req.params.id;
        const containerInfo = await (0, dockerService_1.getContainerByOrganization)(organizationId);
        await (0, dockerService_1.stopContainer)(containerInfo.Id);
        res.json({ message: `El bot de la organizacion ${organizationId} ha sido detenido` });
    }
    catch (error) {
        console.log(error.message);
        res.status(500).json({ error: error.message });
    }
});
// Eliminar un contenedor por ID
router.delete("/:id", async (req, res) => {
    try {
        const organizationId = req.params.id;
        const containerInfo = await (0, dockerService_1.getContainerByOrganization)(organizationId);
        await (0, dockerService_1.removeContainer)(containerInfo.Id);
        res.json({ message: `El bot de la organizacion ${organizationId} removed` });
    }
    catch (error) {
        res.status(500).json({ error: error.message });
    }
});
// Crear un nuevo contenedor
router.post("/create", async (req, res) => {
    try {
        const { organizationId } = req.body;
        const port = await (0, dockerService_1.getAvailablePort)();
        if (!port) {
            res.status(400).json({ error: "Port is required" });
            return;
        }
        if (await (0, dockerService_1.existsContainer)(organizationId)) {
            res.json({ message: `Ya existe un bot de whatsapp creado para esta organizacion` });
            return;
        }
        const containerName = `${organizationId}_bot_${port}`;
        const imageName = "txbot";
        const containerId = await (0, dockerService_1.createContainer)(port, containerName, imageName);
        console.log(`Se ha creado un nuevo bot en el contenedor ${containerId} para la organizacion ${organizationId}`);
        res.json({ message: `El bot ha sido creado con exito`, port, organizationId });
    }
    catch (error) {
        res.status(500).json({ error: error.message });
    }
});
// Consultar el estado de un contenedor par auna organizationId
router.post("/:id/status", async (req, res) => {
    try {
        const organizationId = req.params.id;
        const info = await (0, dockerService_1.getContainerByOrganization)(organizationId);
        res.json({ state: BOT_STATE.EXISTS, status: info.Status, serverState: SERVER_STATE.RUNNING });
    }
    catch (error) {
        res.status(500).json({ error: error.message, code: 404 });
    }
});
router.post("/:id/send", async (req, res) => {
    try {
        const organizationId = req.params.id;
        const data = req.body;
        const info = await (0, dockerService_1.getContainerByOrganization)(organizationId);
        const url = getContainerApiUrl(info.Ports[0].PublicPort.toString());
        const result = await axios_1.default.post(url + "v1/messages", data);
        if (result.status !== 200) {
            throw new Error("Ha ocurrido un error al enviar el mensaje" + result);
        }
        res.json({ message: `Mensaje enviado` });
    }
    catch (error) {
        res.status(500).json({ error: error.message });
    }
});
router.post("/:id/session", async (req, res) => {
    try {
        const organizationId = req.params.id;
        const data = req.body;
        const info = await (0, dockerService_1.getContainerByOrganization)(organizationId);
        const url = getContainerApiUrl(info.Ports[0].PublicPort.toString());
        const result = await axios_1.default.post(url + "v1/session", data);
        if (result.status !== 200) {
            throw new Error("Ha ocurrido un error al enviar el mensaje" + result);
        }
        const resultData = result.data;
        res.json({ message: `${resultData}` });
    }
    catch (error) {
        res.status(500).json({ error: error.message });
    }
});
exports.default = router;
