#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <Judy.h>
 
 
#define Nchunks 10
#define NR 199000000
#define MAXL 511
#define MAXLINELEN2 32000

int rl[NR];
char id[NR][20];
char b[NR][MAXL];
char fl [MAXLINELEN2];
char fn[Nchunks][1024];

int main (int argc, char **argv){
  Pvoid_t assoc_arr = (Pvoid_t) NULL;
  PWord_t val; 
  uint8_t idx[MAXLINELEN2];

  FILE *f;
  FILE *fo[Nchunks];
  int fol[Nchunks];
  int nr=0,nu=0;
  char *s;
  int i,j,l,ml=0;
  int chunksize;
  int chunk;
  
  printf("reading %s\n",argv[1]);
  f=fopen(argv[1],"r");
  while (fgets(fl,MAXLINELEN2,f)){
    //    s=strtok(&fl,"\t");
    //    printf("%s\n%s",fl,s);
    l=strlen(fl);
    if (l<MAXL){
      strcpy(b[nr],fl);
      s=strtok(&fl,"\t");
      s=strtok(NULL,"\t");
      s=strtok(NULL,"\t");
      //      printf("%s\n",s);
        // insert some values
      JSLI(val, assoc_arr,s);
      *val = 0;
    } else{
      printf("ERR line too long, line %d\n%s\n",nr+1,fl);break;
    }
    if (l>ml){ml=l;}
    nr++;
    if (nr>=NR){
      printf("ERR more than %d lines in sam. Input chopped here.\n",nr);break;
    }
    //	     break;
  }
  printf("nlines %d  maxlen %d\n",nr,ml);
  close(f);
 
   // iterate over indexes-values, count refIDs
  idx[0] = '\0';
  JSLF(val, assoc_arr, idx);
  while(val != NULL) {
    //    printf("'%s' -> %d\n", idx, *val);
    nu++;
    JSLN(val, assoc_arr, idx);
  }
  chunksize=nu/Nchunks;
  printf("n_refs %d chunksize  %d\n",nu,chunksize);
  chunk=0;
  i=0;

  int ul=0;
  // assign chunk to readID
  // iterate over indexes-values
  idx[0] = '\0';
  JSLF(val, assoc_arr, idx);
  while(val != NULL) {
    if (i>chunksize){
      if (chunk<Nchunks) {chunk++;i=0;}
    }
    //    printf("'%s' -> %d\n", idx, *val);
    *val=chunk;
    JSLN(val, assoc_arr, idx);
    i++;
  }
  printf("last chunk %d size %d\n",chunk,i);

  //dump chunks
  for (i=0;i<Nchunks;i++){
    sprintf(fn[i],"%s-%d",argv[1],i);
    printf("%s\n",fn[i]);
    fo[i]=fopen(fn[i],"w");    fol[i]=0;
  }
  for (j=0;j<nr;j++){
    int v;
    strcpy(fl,b[j]);
    s=strtok(&fl,"\t");
    s=strtok(NULL,"\t");
    s=strtok(NULL,"\t");
    JSLI(val, assoc_arr,s);
    v=*val;
    if ((v>=0)&&(v<Nchunks)){
      fprintf(fo[v],"%s",b[j]);fol[v]++;
    }else{ul++;
      //      printf("ERR wrong chunk %d for line %d\ntok %s\n%s\n",v,j,s,b[j]);
    }
  }
  for (i=0;i<Nchunks;i++){
    fclose(fo[i]);
    printf("%d : %d\n",i,fol[i]);   
  }
  printf("ul: %d\n",ul);
  JudySLFreeArray(&assoc_arr, PJE0);

  return 0;
}
