#ifndef FITSFILES_HPP
#define FITSFILES_HPP

#include "cutout.hpp" // struct fits_card

#include <set>
#include <map>
#include <vector>
#include <string>

namespace fitsfiles
{
   std::string cfitsio_errmsg(const char * filename, int line_num, int status);

   // for db-ingestion

   std::uintmax_t fileSize(std::string pathname);
   std::vector<std::string> globVector(const std::string& pattern);
 
   struct keys_by_type
   {
      std::set<std::string> strKeys;
      std::set<std::string> uintKeys;
      std::set<std::string> doubleKeys;
   };

   struct key_values_by_type
   {
      std::map<std::string, std::string>   strValues;
      std::map<std::string, unsigned long> uintValues;
      std::map<std::string, double>        doubleValues;
   };

   struct Hdu 
   {
      unsigned int m_hdunum;
      std::string  m_header;
      key_values_by_type key_values;
   };

   std::vector<Hdu> fname2hdrstr(std::string filename, unsigned int maxHduPos, unsigned int minHduPos = 1, const keys_by_type *keys = nullptr);


   // for services

   std::string read_header(std::string pathname, unsigned int hdunum);
   void fits_hdu_cut(const std::string infile, const unsigned int hdunum,
         const std::string outfile);
   std::string append_card_if_not_in_header(std::string header, const std::vector<fits_card> additional_cards);

   // for vlkb cmds

   std::string read_card(const std::string pathname, unsigned int hdunum, const std::string keyname);
   void        add_cards_if_missing(const std::string pathname, unsigned int hdunum, const std::vector<struct fits_card> cards);
   int         mod_value(std::string filename, std::string token, std::string keyvalue);

   std::map<std::string, std::string> read_header_wcs_coord_type(const std::string pathname, unsigned int hdunum, char altwcs = ' ');

   double calc_nullvals(std::string pathname, unsigned int hdunum,
         unsigned long long & null_cnt, unsigned long long & total_cnt);

};

#endif