import { Type } from "@sinclair/typebox";
import { FirRouteInput, FirRouteOptions } from "../util/routewrap";
import {git} from "../util/git.ts";
import { randomUUID } from "crypto";
import path from "path";
import {fileURLToPath} from 'url';
import { getCarts } from "../util/carts.ts";
import { getRelease, insertRelease } from "../dbal/dbal.ts";
import { ManifestType } from "../types.ts";
const __dirname = fileURLToPath(new URL('.', import.meta.url));
const reposPath = path.resolve(__dirname, "..", "..", "..", "repos");

const method = "POST";
const url = "/api/release";

const payloadT = Type.Any();

const handler = async ({payload}: FirRouteInput<typeof payloadT>) => {
	const {manifest, token} = payload;

	if (!ManifestType.Check(manifest)) {
		return false;
	}

	const release = await getRelease({author: manifest.author, slug: manifest.id, version: manifest.version});
	if (release) {
		return false;
	}

	const uuid = randomUUID();
	const repoPath = path.join(reposPath, uuid);

	await git.clone({
		from: manifest.repo,
		to: repoPath,
		auth: token,
	});

	const carts = await getCarts(repoPath, manifest.carts);

	await insertRelease({
		manifest,
		carts,
	});

	console.log({
		manifest,
		carts,
	});

	return true;
};

export default {
	method,
	url,
	payloadT,
	handler,
} as const satisfies FirRouteOptions<typeof payloadT>;