#include <iostream>
#include <vector>
#include "histogram.h"
#include "text.h"
#include "svg.h"
#include <curl/curl.h>
#include <sstream>


using namespace std;



struct Input {
    vector<double> numbers;
    size_t bin_count{};
};

Input input_data(istream& str, bool prompt) {

    size_t number_count;
    if (prompt){
        cerr << "Enter number count: ";
    }
    str >> number_count;

    Input in;

    if (prompt){
        cerr << "Enter bin count: ";
    }
    str >> in.bin_count;

    in.numbers.resize(number_count);

    if (prompt){
        cerr << "Enter numbers: ";
    }
    for (size_t i = 0; i < number_count; i++) {
        str >> in.numbers[i];
    }
    return in;
};

size_t write_data(void* items, size_t item_size, size_t item_count, void* ctx) {
    size_t data_size = item_size * item_count;
    stringstream* buffer = reinterpret_cast<stringstream*>(ctx);
    buffer->write(reinterpret_cast<const char*>(items), data_size);
    return data_size;
}

Input download(const string& address) {
    stringstream buffer;
    CURL* curl = curl_easy_init();
    if(curl) {
        CURLcode res;
        res = curl_easy_perform(curl);

        curl_easy_setopt(curl, CURLOPT_URL, address.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);

        if(res != CURLE_OK){
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
            curl_easy_strerror(res));
            exit(1);
        }
        curl_easy_cleanup(curl);
    }
    return input_data(buffer, false);
}

int main( int argc, char* argv[]){
    Input input;
    if (argc > 1){
        string adr, format, type;
        if ((adr=argv[1]).substr(0,7)!= "http://"){
            if ((format=argv[1])== "-format"){
                if ((type=argv[2])== "svg"){
                    input = download(argv[3]);
                    const auto bins = make_histogram(input.numbers, input.bin_count);
                    show_histogram_svg(bins);
                }else if ((type=argv[2])== "text"){
                    input = download(argv[3]);
                    auto bins = make_histogram(input.numbers, input.bin_count);
                    show_histogram_text(bins, input.bin_count);
                }else{
                    cerr << "wrong type, choose format 'svg' or 'txt'" << endl;
                }
            }else{
                cerr << "type '-format' to choose output format" << endl;
            }
        }else{
            if ((format=argv[2])== "-format"){
                if ((type=argv[3])== "svg"){
                    input = download(argv[3]);
                    const auto bins = make_histogram(input.numbers, input.bin_count);
                    show_histogram_svg(bins);
                }else if ((type=argv[3])== "text"){
                    input = download(argv[3]);
                    auto bins = make_histogram(input.numbers, input.bin_count);
                    show_histogram_text(bins, input.bin_count);
                }else{
                    cerr << "wrong type, choose format 'svg' or 'txt'" << endl;
                }
            }else{
                cerr << "type '-format' to choose output format" << endl;
            }
        }
    }else{
        input = input_data(cin, true);
        const auto bins = make_histogram(input.numbers, input.bin_count);
        show_histogram_svg(bins);
    }
}