#include <iostream>
#include <vector>
#include <string>
#include <hist_proc.h>
#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{};
    size_t number_count{};
};



Input
input_data(istream& in, bool prompt) {
    if (prompt == true){
    size_t number_count;
    cerr << "input number count";
    in >> number_count;
    Input inn;
    inn.numbers.resize(number_count);
    vector<double> numbers(number_count);
    cerr << "input numbers";
    for (size_t i = 0; i < number_count; i++) {
        in >> inn.numbers[i];
    }

size_t bin_count;
cerr << "input amount of bins";
in >> inn.bin_count;
return inn;
    }
    else {
    size_t number_count;
    cout << "input number count";
    in >> number_count;
    Input inn;
    inn.numbers.resize(number_count);
    vector<double> numbers(number_count);
    cout << "input numbers";
    for (size_t i = 0; i < number_count; i++) {
        in >> inn.numbers[i];
    }

    size_t bin_count;
    cout << "input amount of bins";
    in >> inn.bin_count;
    return inn;
    }
}

static 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, bool proverka_skorosti) {
    stringstream buffer;
    CURL* curl = curl_easy_init();
    if(curl)
    {
        CURLcode res;
        const char* res2;
        curl_easy_setopt(curl, CURLOPT_URL, address.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
        res = curl_easy_perform(curl);
        if(!res) {
        curl_off_t speed;
      res = curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD_T, &speed);
        if(!res) {
        cerr << "Upload speed "<< speed << " bytes/sec\n";

                }
            }

    curl_easy_cleanup(curl);
    }
    curl_global_init(CURL_GLOBAL_ALL);
    return input_data(buffer, true);

}



int main(int argc, char* argv[])
{

    Input in;
    CURL *curl = curl_easy_init();
    if (argc > 1) {
     in = download(argv[1], false);
    } else {
        in = input_data(cin, true);
    }
    auto bins = make_histogram(in.numbers, in.bin_count);
    auto procent = make_histogram_proc(in.numbers, in.bin_count, bins);
    show_histogram_svg(bins, procent);

    return 0;
}