#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "fitsio.h"

#define LINE1PIX 2048
#define LINE2PIX 2048

void printerror( int status);

int main(int argc,char *argv[])
{
  fitsfile *fp0;
  int status;

  char info[128], info2[128], file[128], direc[128], command[256];
  char value[64], comment[128];
  FILE *in_pipe;
  int irs=0;

  //  fprintf(stderr,"OK\n");

  if(argc != 2 && argc != 3 && argc != 4 && argc != 5){
    printf("Usage: %s directory [1 or 2] [infomation1] [infomation2]\n", argv[0]);
    exit(1);
    }

  sscanf(argv[1],"%s",direc);
  if(strcmp(direc,"./")==0) direc[0]='\0';
  info[0]='\0';info2[0]='\0';
  if(argc >= 3){
    sscanf(argv[2],"%s",info);
    if(strcmp(info,"1")==0){irs=1;info[0]='\0';}
    else if(strcmp(info,"2")==0){irs=2;info[0]='\0';}
  }
  if(argc >= 4){
    if(irs==0) sscanf(argv[3],"%s",info2);
    else sscanf(argv[3],"%s",info2);
  }
  if(argc == 5 && irs!=0) scanf(argv[3],"%s",info2);

  sprintf(command,"ls %sFMSA????????.fits",direc);
  if ((in_pipe = popen(command,"r")) == NULL){
    exit(1);
  }
  
  while(fgets(file,128,in_pipe)!=NULL){
    if(irs==1 && (file[strlen(file)-7]=='0'||file[strlen(file)-7]=='2'||file[strlen(file)-7]=='4'||file[strlen(file)-7]=='6'||file[strlen(file)-7]=='8')) continue;
    if(irs==2 && (file[strlen(file)-7]=='1'||file[strlen(file)-7]=='3'||file[strlen(file)-7]=='5'||file[strlen(file)-7]=='7'||file[strlen(file)-7]=='9')) continue;
    file[strlen(file)-1]='\0';
    /*Read inputfule*/
    //    fprintf(stderr,"Reading %s  ... ", file);
    //  npixels=naxes[0]*naxes[1];
    status=0;
    if(fits_open_file(&fp0, file, READONLY, &status))
      printerror(status);
    //    if(fits_read_keys_lng(fp0, "NAXIS", 1, 2, naxes1, &nfound, &status)) 
    //      printerror(status);
    //    fprintf(stderr,"%ld x %ld format \n",naxes1[0],naxes1[1]);
    //    if((naxes1[0]!=LINE1PIX)||(naxes1[1]!=LINE2PIX)){
    //      fprintf(stderr,"\nIllegal image format\n");
    //      exit(0);
    //    }
    file[strlen(file)-5]='\0';
    strcat(file,"[0]");
    printf("%s ", file);
    if(fits_read_keyword(fp0, "OBJECT", value, comment, &status)) {
      printf(" # Not found # ");status=0;
    //printerror(status);
    } else printf("%s ", value);
    if(fits_read_keyword(fp0, "B_SPEMOD", value, comment, &status)) {
      printf(" # Not found # ");status=0;
    //printerror(status);
    } else printf("%s ", value);
    if(fits_read_keyword(fp0, "EXPTIME", value, comment, &status)) {
      printf(" # Not found # ");status=0;
    //printerror(status);
    } else printf("%s ", value);
    if (strcmp(info,"")!=0){
      if(fits_read_keyword(fp0, info, value, comment, &status)) {
	printf(" # Not found # ");status=0;
      //printerror(status);
      } else printf("%s", value);
    //    printf("%s\n", comment);
    }
    if (strcmp(info2,"")!=0){
      if(fits_read_keyword(fp0, info2, value, comment, &status)) {
	printf(" # Not found # ");status=0;
      //printerror(status);
      } else printf("%s", value);
    //    printf("%s\n", comment);
    }
    printf("\n");
    if(fits_close_file(fp0, &status)) printerror(status);
  }
  pclose(in_pipe);

  return 0;

}


void printerror( int status)
{
    /*****************************************************/
    /* Print out cfitsio error messages and exit program */
    /*****************************************************/

    char status_str[FLEN_STATUS], errmsg[FLEN_ERRMSG];
  
    if (status)
      fprintf(stderr, "\n*** Error occurred during program execution ***\n");

    fits_get_errstatus(status, status_str);   /* get the error description */
    fprintf(stderr, "\nstatus = %d: %s\n", status, status_str);

    /* get first message; null if stack is empty */
    if ( fits_read_errmsg(errmsg) ) 
    {
         fprintf(stderr, "\nError message stack:\n");
         fprintf(stderr, " %s\n", errmsg);

         while ( fits_read_errmsg(errmsg) )  /* get remaining messages */
             fprintf(stderr, " %s\n", errmsg);
    }

    exit( status );       /* terminate the program, returning error status */
}
