import * as mediaserver from "./server";
import * as db from "./database";
import * as api from "./api";
import * as http from "./http";
import * as cleanup from "./cleanup";
import * as config from "config";

async function run() {
	const dbcfg: object = config.database;
	const bcryptcfg: object = config.bcrypt;
	const satyr: object = {
		privateEndpoint: config.media.privateEndpoint,
		record: config.media.record,
		registration: config.satyr.registration,
		webFormat: config.satyr.webFormat,
		restrictedNames: config.satyr.restrictedNames,
		name: config.satyr.name,
		domain: config.satyr.domain,
		email: config.satyr.email,
		rootredirect: config.satyr.rootredirect,
		version: process.env.npm_package_version
	};
	const nms: object = {
		logType: config.server.logs,
		rtmp: {
			port: config.server.rtmp.port,
			chunk_size: config.server.rtmp.chunk_size,
			gop_cache: config.server.rtmp.gop_cache,
			ping: config.server.rtmp.ping,
			ping_timeout: config.server.rtmp.ping_timeout,
		},
		http: {
			port: config.server.http.port + 1,
			mediaroot: config.server.http.directory,
			allow_origin: config.server.http.allow_origin
		},
		trans: {
			ffmpeg: config.media.ffmpeg,
			tasks: [
				{
					app: config.media.publicEndpoint,
					hls: config.transcode.hls,
					hlsFlags: config.transcode.hlsFlags,
					dash: config.transcode.dash,
					dashFlags: config.transcode.dashFlags
				}
			]
		},
		auth: {
			api: config.server.api,
			api_user: config.server.api_user,
			api_pass: config.server.api_pass
		}
		
	};
	db.init(dbcfg, bcryptcfg);
	await cleanup.init(config.server.http.directory);
	api.init(satyr);
	http.init(satyr, config.server.http.port, config.ircd);
	mediaserver.init(nms, satyr);
}
run();
export { run };