#pragma once

#ifndef PRINT_DEF
#define PRINT_DEF
#include <string.h>	//for strings
#include <stdio.h>	//for printf,scanf (library for C)
#include <stdlib.h>	//for atoi, atof
#include <string>   //C++ header for string
#include <cstring>
#include <iostream>
#include <stdexcept>
#endif

#include <vector>
#include <sstream>

#ifndef PARSE_DEF
#define PARSE_DEF
#define MAXBUFLEN 200

void getFromString (const char* buf, int* n);
void getFromString (const char* buf, size_t* n);
void getFromString (const char* buf, double* n);
void getFromString (const char* buf, char* n);

int parseString(FILE* input, const char* keyword, const size_t bufLen, char* n);

template<typename T>
int parseNumber(FILE* input, const char* keyword, const size_t bufLen, T* n);

template<typename T>
int parseArray(FILE* input, const char* keyword, const size_t bufLen,
		const size_t arrLen, T y[]);

//
///*template function for parsing initial mole fraction in the droplet*/
//template<typename T>
//int parseDropSpec(FILE* input, const char* keyword, const size_t bufLen,const int* dropType, std::vector<T>& dropPara){
//    char buf[bufLen];
//    char buf1[bufLen];
//    char comment[1];
//    char *ret;
//
//    while (fgets(buf,bufLen, input)!=NULL){
//        comment[0]=buf[0];
//        if(strncmp(comment,"#",1)==0){
//            //printf("Comment!:%s\n",buf);
//        }
//        else{
//            ret=strtok(buf,"=");
//            if(strcmp(ret,keyword)==0){
//                /*offset buf by keyword size + 1 for the "="*/
//                /* Second argument in the strncpy function is the address !!! */
//                /* Note: current version of code can only take dropType =0 or 1 */
//                strncpy(buf1, buf+strlen(keyword)+1, bufLen);
//                printf("%10s: ",keyword);
//                if(*dropType ==0){
//                    /* Convert from char* to double */
////                    std::string str(buf1);
////                    dropPara.push_back(str);
//                    T temp_num = std::stod(buf1) ;
//                    dropPara.push_back(temp_num) ;
//                    printf("%.3f\n",dropPara[0]);
//                }else{
//                    std::istringstream iss(buf1) ;
//                    std::string token;
//                    while(std::getline(iss,token,',')){
//                        T temp_num = std::stod(token);
//                        dropPara.push_back(temp_num);
//                    }
//                    printf("%.3f,%.3f\n",dropPara[0],dropPara[1]);
//                }
//                rewind(input);
//                return(0);
//            }
//        }
//    }
//    rewind(input);
//    return(-1);
//}

/* Extract the droplet species and molefractions from input file using template */
/* Generic template function */
//template<typename T>
//int parseDropSpec(FILE* input, const char* keyword, const size_t bufLen,const int* dropType, std::vector<T>& dropPara){
//    char buf[bufLen];
//    char buf1[bufLen];
//    char comment[1];
//    char *ret;
//    T* n;
//
//    while (fgets(buf,bufLen, input)!=NULL){
//        comment[0]=buf[0];
//        if(strncmp(comment,"#",1)==0){
//            //printf("Comment!:%s\n",buf);
//        }
//        else{
//            ret=strtok(buf,"=");
//            if(strcmp(ret,keyword)==0){
//                /*offset buf by keyword size + 1 for the "="*/
//                /* Second argument in the strncpy function is the address !!! */
//                /* Note: current version of code can only take dropType =0 or 1 */
//                strncpy(buf1, buf+strlen(keyword)+1, bufLen);
//                printf("%10s: ",keyword);
//                if(*dropType ==0){
//                    getFromString(buf1,n);
//                    dropPara.push_back(*n);
//                }else{
//                    std::istringstream iss(buf1) ;
//                    std::string token;
//                    while(std::getline(iss,token,',')){
//                        T arg = std::stod(token);
//                        dropPara.push_back(arg);
//                    }
//                    printf("%15.6e,%15.6e\n",dropPara[0],dropPara[1]);
//                }
//                rewind(input);
//                return(0);
//            }
//        }
//    }
//    rewind(input);
//    return(-1);
//}

//
///* Specialization for string */
//template<>
//int parseDropSpec<std::string>(FILE* input, const char* keyword, const size_t bufLen,const int* dropType, std::vector<std::string>& dropPara);

int parseDrop(FILE* input, const char* keyword,char dropSpec[][10],double dropMole[],const size_t bufLen);

#include "parse.hpp"

#endif


