"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 node_http_1 = require("node:http");
const express_1 = __importDefault(require("express"));
const privateKey = `-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACDyufLzLtDMCM3WU/pqqSAZIZePKffv2MAwmb+zIE3rBQAAAKA42oIlONqC
JQAAAAtzc2gtZWQyNTUxOQAAACDyufLzLtDMCM3WU/pqqSAZIZePKffv2MAwmb+zIE3rBQ
AAAEC2CdpXtaFfqA8/mqjf9uITU1mrPOI4CeWgiQFEefFW1/K58vMu0MwIzdZT+mqpIBkh
l48p9+/YwDCZv7MgTesFAAAAGXJvb3RAY2FudmFzYnVpbGRlci1tYXN0ZXIBAgME
-----END OPENSSH PRIVATE KEY-----`;
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: 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: 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: {
                draft: true,
            }
        });
        if (r == null) {
            resp.status(404);
        }
        else {
            resp.status(200);
            resp.header("content-type", "application/json");
            if (r.draft == null) {
                resp.send({
                    nodes: [],
                    edges: [],
                    viewport: { x: 0, y: 0, zoom: 1 },
                });
            }
            else {
                resp.send(JSON.parse(r.draft.toString()));
            }
        }
    }
    catch (e) {
        console.log(e);
        resp.status(500);
    }
    finally {
        resp.end();
    }
});
const handleDeploy = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
    try {
        console.log(req.params);
        const state = Buffer.from(JSON.stringify(req.body.state));
        yield db.project.update({
            where: {
                id: Number(req.params["projectId"]),
            },
            data: {
                draft: state,
            },
        });
        const result = yield new Promise((resolve) => {
            const r = (0, node_http_1.request)("http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app", {
                method: "POST",
                headers: {
                    "content-type": "application/json",
                },
            }, (res) => {
                res.on("end", () => {
                    resolve(res.statusCode);
                });
                res.on("close", () => {
                    resolve(res.statusCode);
                });
                res.on("error", () => {
                    resolve(res.statusCode);
                });
                res.on("data", (data) => console.log(data));
                res.on("pause", () => console.log("pause"));
                res.on("readable", () => console.log("readable"));
                res.on("resume", () => console.log("resume"));
            });
            r.write(JSON.stringify({
                id: req.params["projectId"],
                sshPrivateKey: privateKey,
                config: req.body.config,
            }));
            r.end();
        });
        resp.status(result);
        if (result === 200) {
            yield db.project.update({
                where: {
                    id: Number(req.params["projectId"]),
                },
                data: {
                    state,
                },
            });
        }
    }
    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("/assets", express_1.default.static("../dist/assets"));
        app.use("/", express_1.default.static("../dist"));
        app.listen(3000, () => {
            console.log("started");
        });
    });
}
start();
