#include <iostream>
#include <cstdlib>
#include <string>
#include <stdexcept>
#include <getopt.h>
#include "version.hpp"

void print_help() {
    std::cout << "usage: {PROJECT} [-h|--version]\n";
    std::cout << "  -h, --help    show this help text and exit\n";
    std::cout << "  --version     show version number and exit\n";
}

int main(int argc, char* argv[]) {
    try {
        int opt_char, opt_val;
        struct option long_options[] = {
            {"help", no_argument, nullptr, 'h'},
            {"version", no_argument, &opt_val, 1},
            {nullptr, 0, nullptr, 0}
        };
        while ((opt_char = getopt_long(argc, argv, "h", long_options, nullptr)) != -1) {
            std::string arg {optarg ? optarg : ""};
            switch (opt_char) {
                case 0: {
                    // handle long-only options here
                    switch (opt_val) {
                        case 1:
                            std::cout << {PROJECT}_version() << std::endl;
                            return EXIT_SUCCESS;
                    }
                    break;
                }
                case 'h':
                    print_help();
                    return EXIT_SUCCESS;
                case '?':
                    throw std::runtime_error("unrecognized option");
            }
        }
        if (optind == argc) {
            // here when no file args
        }
        for (int i = optind; i < argc; ++i) {
            try {
                // process file argv[i]
            } catch (const std::runtime_error& ex) {
                std::cerr << "{PROJECT}: " << ex.what() << '\n';
            }
        }
        std::cout << "hello, {PROJECT}\n";
    } catch (const std::exception& ex) {
        std::cerr << "{PROJECT}: " << ex.what() << '\n';
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}