#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <Judy.h>
 
#define MAXLINELEN 256
 
#define Nchunks 10
//#define NR 199000000
//#define NR 223000000
#define NR 353000000
#define MAXL 230

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

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

  FILE *f;
  FILE *fo[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,8192,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");
        // insert some values
      JSLI(val, assoc_arr,s);
      *val = nr;
    } 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\n",nr);break;}
    //	     break;
  }
  printf("nlines %d  maxlen %d\n",nr,ml);
  close(f);
 
   // iterate over indexes-values, count readIDs
  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/10;
  printf("n_aligned_reads %d chunksize  %d\n",nu,chunksize);
  chunk=1;
  i=0;

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

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

  return 0;
}
