#include <stdio.h>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include "ssh2.hpp"

using namespace std;

std::vector<std::string> explode(char *sep, std::string src)
{
        std::vector<std::string> output;
        boost::char_separator<char> separator(sep);
        boost::tokenizer<boost::char_separator<char> > tokens(src, separator);
        boost::tokenizer<boost::char_separator<char> >::iterator token_iter;

        for (token_iter = tokens.begin(); token_iter != tokens.end(); token_iter++)
                output.push_back(*token_iter);

        return output;
}

vector<string> linux_cpumem(SSH2 *ssh2){
	vector<string> out;
	vector<string> memtotal;
	vector<string> r;
	vector<string> vmstat;
	vector<string> values;
	string result;
	int i,j;
	int idle=0;
	int MemTotal;
	int m1,m2,m3,cpu;
	int mem_acumulada=0;
	int cpu_acumulado=0;
	float mem_used;
	float cpu_used;


	memtotal = ssh2->exec("cat /proc/meminfo |grep MemTotal\n",1);

	if (memtotal.empty()){
		return out;
	}

	r = explode(" ",memtotal.at(0));

	if (r.size()!=3){
		return out;
	}

	MemTotal=toInt(r.at(1));

	vmstat = ssh2->exec("vmstat 1 5\n",7);

	if (vmstat.size()!=12){
		return out;
	}
	
        idle=0;
	for (i=1; i<vmstat.size(); i++){
		values.clear();
		values = explode(" ",vmstat.at(i));
		if (i==1){
			for(j=0; j<values.size(); j++){
				if (values.at(j).compare("id")==0){
					idle=j;
				}
			}
		}else{
			m1=toInt(values.at(3));
			m2=toInt(values.at(4));
			m3=toInt(values.at(5));
			cpu=toInt(values.at(idle));
			mem_acumulada+=MemTotal-(m1+m2+m3);
			cpu_acumulado+=cpu;
		}
	}

       	mem_used=mem_acumulada*5/MemTotal;
       	cpu_used=100 - cpu_acumulado/5;

	out.push_back(toString(mem_used));
	out.push_back(toString(cpu_used));

	return out;
}

vector<string> linux_fs(SSH2 *ssh2){
	vector<string> out;
	vector<string> df;
	vector<string> values;
	vector<string> scount;
	int count;
	int i,j;


	scount = ssh2->exec("df -P | grep dev | wc -l\n",1);

	if (scount.empty() || scount.size()!=1){
		return out;
	}

	count = toInt(scount.at(0));

	printf("%d\n",count);

	df = ssh2->exec("df -P | grep dev\n",count);

	if (df.empty()){
		printf("DF ERROR\n");
		return out;
	}

	for (i=0; i<df.size(); i++){
		values = explode(" ",df.at(i));
		out.push_back(values.at(5));
		out.push_back(values.at(4));
	}



	return out;
}

int main(int argc, char *argv[])
{
	vector<string> results;
	vector<string> r;
	int i;

	SSH2 ssh2=SSH2("127.0.0.1","user","password");

	if (!ssh2.connection()){
		return 0;
	}

	printf("Connected...\n");

	r = linux_cpumem(&ssh2);

	if (r.size()==2){
		printf("mem_used %s\n",r.at(0).c_str());
		printf("cpu_used %s\n",r.at(1).c_str());
	}
	else{
		printf("ERROR CPUMEM\n");
	}


	r.clear();
	r = linux_fs(&ssh2);

	if (!r.empty()){
		for (i=0; i<r.size(); i+=2){
			printf("%s -> %s\n",r.at(i).c_str(),r.at(i+1).c_str());
		}
	}


	ssh2.disconnect();

	return 0;
}
