// CSVReader.h
#pragma once

#include <fstream>
#include <vector>
#include <string>
#include <memory>

namespace math1d_cl 
{
	/**
	 * @brief CSVReader reads CSV files.
	 * @details Reads CSV files. Parses first line as header. Returns empty lines as empty row.
	 * 
	 * @param decimal decimal point char
	 * @param separator column separator char
	 * 
	 */
	class CSVReader 
	{
		public:
			CSVReader(char decimal, char separator);
			void open(std::string file);
			void close();
			std::shared_ptr<std::vector<std::string>> getRow();
			std::shared_ptr<std::vector<std::string>> getHeader();
			bool eof();

		private:
			void explode(std::string input, std::shared_ptr<std::vector<std::string>> output, const char delimiter);
			
			std::ifstream m_fileStream; // Input file stream
			std::shared_ptr<std::vector<std::string>> m_header; // CSV Header

			const char m_decimal;
			const char m_separator;
	};

}