"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const client_1 = require("@prisma/client");
const express_1 = __importDefault(require("express"));
const node_process_1 = require("node:process");
const axios_1 = __importDefault(require("axios"));
const db = new client_1.PrismaClient();
const handleProjectCreate = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
    try {
        const { id } = yield db.project.create({
            data: {
                userId: "gio", // req.get("x-forwarded-userid")!,
                name: req.body.name,
            },
        });
        resp.status(200);
        resp.header("Content-Type", "application/json");
        resp.write(JSON.stringify({
            id,
        }));
    }
    catch (e) {
        console.log(e);
        resp.status(500);
    }
    finally {
        resp.end();
    }
});
const handleProjectAll = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
    try {
        const r = yield db.project.findMany({
            where: {
                userId: "gio", // req.get("x-forwarded-userid")!,
            },
        });
        resp.status(200);
        resp.header("Content-Type", "application/json");
        resp.write(JSON.stringify(r.map((p) => ({
            id: p.id.toString(),
            name: p.name,
        }))));
    }
    catch (e) {
        console.log(e);
        resp.status(500);
    }
    finally {
        resp.end();
    }
});
const handleSave = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
    try {
        yield db.project.update({
            where: {
                id: Number(req.params["projectId"]),
            },
            data: {
                draft: Buffer.from(JSON.stringify(req.body)),
            },
        });
        resp.status(200);
    }
    catch (e) {
        console.log(e);
        resp.status(500);
    }
    finally {
        resp.end();
    }
});
const handleSavedGet = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
    try {
        const r = yield db.project.findUnique({
            where: {
                id: Number(req.params["projectId"]),
            },
            select: {
                state: true,
                draft: true,
            },
        });
        if (r == null) {
            resp.status(404);
        }
        else {
            resp.status(200);
            resp.header("content-type", "application/json");
            if (r.draft == null) {
                if (r.state == null) {
                    resp.send({
                        nodes: [],
                        edges: [],
                        viewport: { x: 0, y: 0, zoom: 1 },
                    });
                }
                else {
                    resp.send(JSON.parse(Buffer.from(r.state).toString("utf8")));
                }
            }
            else {
                resp.send(JSON.parse(Buffer.from(r.draft).toString("utf8")));
            }
        }
    }
    catch (e) {
        console.log(e);
        resp.status(500);
    }
    finally {
        resp.end();
    }
});
const handleDeploy = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
    try {
        const projectId = Number(req.params["projectId"]);
        const state = Buffer.from(JSON.stringify(req.body.state));
        const p = yield db.project.findUnique({
            where: {
                id: projectId,
            },
            select: {
                instanceId: true,
            },
        });
        if (p === null) {
            resp.status(404);
            return;
        }
        yield db.project.update({
            where: {
                id: projectId,
            },
            data: {
                draft: state,
            },
        });
        let r;
        if (p.instanceId == null) {
            r = yield axios_1.default.request({
                url: "http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app",
                method: "post",
                data: {
                    config: req.body.config,
                },
            });
            if (r.status === 200) {
                yield db.project.update({
                    where: {
                        id: projectId,
                    },
                    data: {
                        state,
                        draft: null,
                        instanceId: r.data.id,
                        deployKey: r.data.deployKey,
                    },
                });
            }
        }
        else {
            r = yield axios_1.default.request({
                url: `http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app/${p.instanceId}`,
                method: "put",
                data: {
                    config: req.body.config,
                },
            });
            if (r.status === 200) {
                yield db.project.update({
                    where: {
                        id: projectId,
                    },
                    data: {
                        state,
                        draft: null,
                    },
                });
            }
        }
    }
    catch (e) {
        console.log(e);
        resp.status(500);
    }
    finally {
        resp.end();
    }
});
function start() {
    return __awaiter(this, void 0, void 0, function* () {
        yield db.$connect();
        const app = (0, express_1.default)();
        app.use(express_1.default.json());
        app.post("/api/project/:projectId/saved", handleSave);
        app.get("/api/project/:projectId/saved", handleSavedGet);
        app.post("/api/project/:projectId/deploy", handleDeploy);
        app.get("/api/project", handleProjectAll);
        app.post("/api/project", handleProjectCreate);
        app.use("/", express_1.default.static("../front/dist"));
        app.listen(node_process_1.env.DODO_PORT_WEB, () => {
            console.log("started");
        });
    });
}
start();
