#include <iostream>
#include <pthread.h>
#include <componentThread.h>
#include <spinscale/componentThread.h>
#include <spinscale/runtime.h>
#include <marionette/marionette.h>

int main(int argc, char *argv[], char *envp[])
{
	/* Set the pptr thread ID and thread before using any ComponentThread
	 * functionality.
	 */
	sscl::ComponentThread::setPuppeteerThreadId(smo::SmoThreadId::MRNTT);
	sscl::ComponentThread::setPuppeteerThread(smo::mrntt::thread);
	pthread_setname_np(pthread_self(), "smo:CRT:main");
	/* We don't do anything inside of main()
	 * Main merely waits for the marionette thread to exit.
	 */
	std::cout << "CRT:" << __func__ << ": about to JOLT Mrntt with cmdline args"
		<< '\n';
	boost::asio::post(smo::mrntt::thread->getIoContext(),
		[argc, argv, envp]()
		{
			std::cout << "Mrntt:" << __func__ << ":JOLTED: setting cmdline args"
				<< '\n';
			sscl::CrtCommandLineArgs::set(argc, argv, envp);
			smo::mrntt::thread->getIoContext().stop();
		}
	);

	smo::mrntt::thread->thread.join();
	std::cout << "CRT:" << __func__ << ": Mrntt exited with code '"
		<< sscl::pptr::exitCode << "'\n";
	return sscl::pptr::exitCode;
}
