#pragma once

#include <vector>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cmath>

void drawHistogram(const std::vector<double> &data, const int bin_count) {
    if (data.empty() || bin_count < 1) return;

    auto minMaxIt = std::minmax_element(data.begin(), data.end());
    double minVal = *minMaxIt.first;
    double maxVal = *minMaxIt.second;
    double range = (maxVal - minVal == 0) ? 1.0 : maxVal - minVal;

    std::vector<int> counts(bin_count, 0);

    for (const double &x : data) {
        int bin = std::floor((x - minVal) / range * (bin_count));
        bin = bin == bin_count ? bin_count - 1 : bin;
        ++counts[bin];
    }

    int maxCount = *std::max_element(counts.begin(), counts.end());
    
    for (int i = 0; i < bin_count; ++i) {
        double binMid = minVal + ((i + 0.5) / (bin_count)) * range;
        int barWidth = (maxCount > 0) ? (counts[i] * 50 / maxCount) : 0;
        std::cout << std::fixed << std::setprecision(3) << std::setw(7) << binMid << " | "
                  << std::string(barWidth, '*') << " (" << counts[i] << ")\n";
    }
}