#include <utils/Process.h>
#include <utils/Logger.h>

#include <QCoreApplication>
#include <QStringList>

#include <unistd.h>
#include <cstdio>
#include <iostream>
#include <memory>
#include <stdexcept>

namespace Process {
	
void restartHyperion(bool asNewProcess)
{
	Logger* log = Logger::getInstance("Process");
	std::cout << std::endl
		<< "      *******************************************" << std::endl
		<< "      *      hyperion will restart now          *" << std::endl
		<< "      *******************************************" << std::endl << std::endl;
		
	
	QStringList qargs = QCoreApplication::arguments();
	int size = qargs.size();
	char *args[size+1];
	args[size] = nullptr;
	for(int i=0; i<size; i++)
	{
		int str_size = qargs[i].toLocal8Bit().size();
		args[i] = new char[str_size+1];
		strncpy(args[i], qargs[i].toLocal8Bit().constData(),str_size );
		args[i][str_size] = '\0';
	}

	execv(args[0],args);
	Error(log, "error while restarting hyperion");
}

std::string command_exec(const char* cmd)
{
	char buffer[128];
	std::string result = "";
	std::shared_ptr<FILE> pipe(popen(cmd, "r"), pclose);
	if (pipe) 
	{
	while (!feof(pipe.get()))
	{
		if (fgets(buffer, 128, pipe.get()) != NULL)
			result += buffer;
	}
	}
	
	return result;
}

};