"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");
            console.log(r);
            if (r.draft == null) {
                if (r.state == null) {
                    resp.send({
                        nodes: [],
                        edges: [],
                        viewport: { x: 0, y: 0, zoom: 1 },
                    });
                }
                else {
                    resp.send(JSON.parse(r.state.toString()));
                }
            }
            else {
                resp.send(JSON.parse(Buffer.from(r.state).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 {
        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 r = yield axios_1.default.post("http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app", { config: req.body.config });
        if (r.status === 200) {
            const d = r.data;
            yield db.project.update({
                where: {
                    id: Number(req.params["projectId"]),
                },
                data: {
                    state,
                    draft: null,
                    instanceId: d.id,
                    deployKey: d.deployKey,
                },
            });
        }
    }
    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();
