#include "mail.h"
#include "plot.h"


//Se crean los arreglos correspondientes al numeros de conexiones y al tiempo a graficar
//de acuerdo a lo indicado en plot.h
int ncon[MAX_TIME/SCAN_INTERVAL];
int t[MAX_TIME/SCAN_INTERVAL];


//Se crean los mutexs y variables de condicion para el arreglo de numero de conexiones
//y para dar paso al grafico
pthread_mutex_t ncon_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t plot_again = PTHREAD_COND_INITIALIZER;


int main(int args, char ** arg){

    //Revisa si estan si los argumentos son los necesarios, si no imprime un aviso y termina
    if (args !=5){
        printf("Usage: mc_tcp [SMTP SERVER] [EMAIL] [AUTH IN BASE64] [CONNECTION THRESHOLD]\n");
	exit(0);
    }

    int umbral = atoi(arg[4]);


    FILE *pf;

    //Inicializacion de variables para setear la señal de alarma cada 2 segundos
    struct itimerval timerval;
    struct timeval period;
    sigset_t mask;
    int signo;

    period.tv_sec=2;
    period.tv_usec=0;
    timerval.it_interval=timerval.it_value=period;
    setitimer(ITIMER_REAL, & timerval, NULL);

    //Seteo de señales de alarma

    sigemptyset(&mask);   
    sigaddset(&mask,SIGALRM);  
    sigprocmask(SIG_BLOCK, &mask, NULL);
    
    
   
    int n;	
    pthread_t plotid,mailid;
    struct info * mail_info;

    //Creacion de hebra destinada al grafico, siempre activa en paralelo
    //con la hebra principal	
    if ( pthread_create(&plotid, NULL, plot, NULL) != 0 ){
        printf("can't create thread \n");
        exit(0);
    }


    int j;

    //Incializacion del arreglo correspondienete al eje x con tiempos negativos
    for( j = 0; j < MAX_TIME/SCAN_INTERVAL; j++)
	t[j] = j*SCAN_INTERVAL - MAX_TIME;
    


    while (1) {	
        signo=SIGINT;  /* Diferente a sigalarm */
        while(signo!=SIGALRM)  
            sigwait(&mask, &signo); /* espera por la señal de alarma */

	//if ((pf = popen("netstat -s -t | grep \"conexiones establecidas\"", "r")) == NULL ) { /* Creacion de pipa simple ejecutando netstat (español) */ 
        if ((pf = popen("netstat -s -t | grep \"connections established\"", "r")) == NULL ) { /* Creacion de pipa simple ejecutando netstat (ingles) */
            perror("popen");
            exit(1);
        }

        if (fscanf(pf, "%d" , &n) == EOF ) { /* Se lee el primer entero de esa linea, correspondiente al numero de conexiones establecidas */ 
            fprintf(stderr, "No ouput from netstat\n");
            exit(1);
        }
	



        for( j = 0; j < MAX_TIME/SCAN_INTERVAL - 1 ; j++)
            t[j] = t[j+1]; 
	

        t[MAX_TIME/SCAN_INTERVAL - 1] = t[MAX_TIME/SCAN_INTERVAL - 2] + 2; /* Se actualiza el eje del tiempo */ 
        

        if( n > umbral){ /* Si se supera el umbral estipulado */

            //Creacion de la estructura con los datos necesarios para pasarla a la hebra mail
            mail_info = (struct info *) malloc(sizeof(struct info));
            mail_info->server = arg[1];
            mail_info->email = arg[2];		    
            mail_info->auth = arg[3];
            mail_info->umbral = umbral;
            mail_info->ncon = n;

	    if ( pthread_create(&plotid, NULL, mail, (void *)mail_info) != 0 ){ /* Se crea una hebra encargada de mandar el mail */
                printf("can't create thread \n");
                exit(0);
            }
        }	
        
        pthread_mutex_lock(&ncon_lock); /* Zona critica debido al acceso a ncon */

        for( j = 0; j < MAX_TIME/SCAN_INTERVAL - 1 ; j++)
		ncon[j] = ncon[j+1];

        ncon[MAX_TIME/SCAN_INTERVAL - 1] = n; /* Actualizacion del arreglo */
	
        pthread_mutex_unlock(&ncon_lock); /* Liberacion de la zona critica*/
        pthread_cond_signal(&plot_again); /* Se le indica a la hebra de grafico que esta listo */

        pclose(pf); /* Se cierra el descriptor de archivo para abrirse nuevamente en el siguente loop */

    }

    exit(0);
}


