/**
* Analiza el fichero pasado en la llamada del programa.
* @param  fich nombre del fichero.
* @return      Si se hizo correctamente, se retorna la espera minima, sino 0 (false) para indicar falla.
*/
int analizar_fichero(char *fich) {

FILE *fd     = NULL;        /*File descriptor del fichero de centros*/
char buffer[100];           /*Buffer de lectura para el archivo.*/
distr cent;                 /*Variable que representa un centro*/
char *nom, *DNS;            /*Nombre y DNS de centro de distribucion*/
int puerto, respuesta;      /*Puerto y tiempo de respuesta de centro de distribucion*/
int min_resp = MAX_INT;     /*Tiempo de respuesta minimo de los centros de distribucion*/
int i;                      /*Variable de uso generico*/

    /*Abre el archivo*/
    if ((fd = fopen(fich, "r")) == NULL) {
        return errorFile(__LINE__);
    }

    /*Lee el archivo hasta el final*/
    while (fscanf(fd, "%s", buffer) != EOF) {

        nom = strtok(buffer, "&");
        DNS = strtok(NULL, "&");
        puerto = atoi(strtok(NULL, "&"));

        /*Intenta conseguir una conexion con el servidor 5 veces, si no lo logra lo ignora*/
        for (i = 0; i < 5; ++i) {

            /*Para conseguir el tiempo de respuesta de este servidor*/
            if ((respuesta = conectar_centro('t', puerto, DNS)) >= 0) {

                break;
            }
        }

        /*Si no logro conectarse con el servidor*/
        if (i == 5) {

            continue;
        }

        /*Si consegui un nuevo minimo tiempo de respuesta*/
        if (respuesta < min_resp) {

            min_resp = respuesta;
        }

        if((cent = create_distr(nom, DNS, puerto, respuesta)) == NULL) {

            return -1;
        }

        if (!add(&centros, cent)) {

            free(cent);
        }
    }

    /*Si no logro conectarse nunca*/
    if (is_empty(centros)) {

        return 0;
    }

    return min_resp;
}
int main(int argc, char *argv[]){
  
  ij_net_t G1, G2;
  
  int N, m, m0, k_max;
  coupling_t matr;
  double gamma;
  distr_t delay_distr;

  char str[256];
  
  if (argc < 10){
    printf("Usage: %s <N> <m> <m0> <outfile> <a> <b> <c> <d> <gamma>\n", argv[0]);
    exit(1);
  }

  srand(time(NULL));
  
  /* Diagonal coupling */
  matr.a = atof(argv[5]);
  matr.b = atof(argv[6]);
  matr.c = atof(argv[7]);
  matr.d = atof(argv[8]);
  gamma = atof(argv[9]);

  N = atoi(argv[1]);
  m = atoi(argv[2]);
  m0 = atoi(argv[3]);

  G1.size = (N+m0) * m;
  G2.size = (N+m0) * m;

  init_structure(&G1, N);
  init_structure(&G2, N);
  
  
  G1.K = init_network(&G1, m0);
  G2.K = init_network(&G2, m0);

  delay_distr.N = N;
  delay_distr.gamma = gamma;
  delay_distr.x_min = 1;
  delay_distr.distr = malloc(N * sizeof(double));

  create_distr(delay_distr.distr, delay_distr.gamma, delay_distr.x_min, N);

  init_times_delay(&G2, &delay_distr, m0, N);

  dump_times(&G2, N);
  
  fprintf(stderr, "Init finished!\n");
  
  grow_multi_net_delay(&G1, &G2, N, m, m0, &matr);
  
  //printf("### G1\n");
  sprintf(str, "%s_layer1.txt", argv[4]);
  dump_network_to_file(&G1, str);
  
  //printf("### G2\n");
  sprintf(str, "%s_layer2.txt", argv[4]);
  dump_network_to_file(&G2, str);
  
  /* dump_network_to_file(S, S_num, argv[4]); */
  /* printf("Network dumped!\n"); */
  /* k_max = degree_distr(S, S_num, &distr); */
  /* printf("k_max is: %d\n", k_max); */
  /* dump_distr_to_file(distr, k_max, argv[5]); */
  
}