import fs from "node:fs"
import path from "node:path"
import { Command } from "commander"
import { createClient } from "comty.js"
import SessionModel from "comty.js/dist/models/session/index.js"

import Cache from "./classes/cache.js"
import Config from "./classes/config.js"

import readCommandsFiles from "./utils/readCommandsFiles.js"
import importDefaults from "./utils/importDefaults.js"
import buildCommands from "./utils/buildCommands.js"
import authorizeAccount from "./utils/authorizeAccount.js"

const commandsPath = path.resolve(import.meta.dirname, "commands")
const packageJsonPath = path.resolve(import.meta.dirname, "../package.json")

// only for development
if (process.env.NODE_ENV === "development") {
	process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0
}

async function main() {
	let packageJson = await fs.promises.readFile(packageJsonPath, "utf8")
	packageJson = JSON.parse(packageJson)

	global.config = new Config()
	global.comtyClient = createClient({
		origin:
			process.env.NODE_ENV === "production"
				? "https://api.comty.app"
				: "https://indev.comty.app/api",
	})

	await global.config.initialize()
	await Cache.initialize()

	if (!global.config.get("auth")) {
		console.log("No auth found, authentication required...")

		await authorizeAccount()
	}

	SessionModel.default.token = global.config.get("auth").token

	let program = new Command()

	program
		.name(packageJson.name)
		.description(packageJson.description)
		.version(packageJson.version)

	let commands = await readCommandsFiles(commandsPath)
	commands = await importDefaults(commands)
	program = await buildCommands(commands, program)

	program.parse()

	return 0
}

main()
