#include "histogram.h"

using namespace std;

void
find_minmax(const vector<double>& numbers, double& min, double& max, bool& empty_vector)
{
    if (numbers.empty())
    {
        empty_vector = true;
    }
    else
    {
        min = numbers[0];
        max = numbers[0];
        for (double x : numbers)
        {
            if (x > max )
            {
                max = x;
            }
            if (x < min)
            {
                min = x;
            }
        }
    }
}

vector<size_t>
make_histogram(const vector<double>& numbers, size_t& bin_count)
{
    double min = 0;
    double max = 0;
    bool empty_vector = false;
    find_minmax(numbers, min, max, empty_vector);
    vector<size_t> bins(bin_count);
    if (empty_vector)
    {
        for (size_t y : bins)
        {
            y = 0;
        }
    }
    else
    {
        auto bin_size = (max - min)/bin_count;
        for (double number : numbers)
        {
            bool found = false;
            for (size_t j = 0; (j < bin_count - 1) && !found; j++)
            {
                auto lo = min + j * bin_size;
                auto hi = min + (j + 1) * bin_size;
                if ((lo <= number) && (number < hi))
                {
                    bins[j]++;
                    found = true;
                }
            }
            if (!found)
            {
                bins[bin_count - 1]++;
            }
        }
    }
    return bins;
}