//===----------------------------------------------------------------------===//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include <format>

#include <array>
#include <limits>
#include <random>
#include <string>

#include "CartesianBenchmarks.h"
#include "benchmark/benchmark.h"

// *** Localization ***
enum class LocalizationE { False, True };
struct AllLocalizations : EnumValuesAsTuple<AllLocalizations, LocalizationE, 2> {
  static constexpr const char* Names[] = {"LocFalse", "LocTrue"};
};

template <LocalizationE E>
struct Localization {};

template <>
struct Localization<LocalizationE::False> {
  static constexpr const char* fmt = "";
};

template <>
struct Localization<LocalizationE::True> {
  static constexpr const char* fmt = "L";
};

// *** Types ***
enum class TypeE { Float, Double, LongDouble };
// TODO FMT Set to 3 after to_chars has long double suport.
struct AllTypes : EnumValuesAsTuple<AllTypes, TypeE, 2> {
  static constexpr const char* Names[] = {"Float", "Double", "LongDouble"};
};

template <TypeE E>
struct Type {};

template <>
struct Type<TypeE::Float> {
  using type = float;
};

template <>
struct Type<TypeE::Double> {
  using type = double;
};

template <>
struct Type<TypeE::LongDouble> {
  using type = long double;
};

// *** Values ***
enum class ValueE { Inf, Random };
struct AllValues : EnumValuesAsTuple<AllValues, ValueE, 2> {
  static constexpr const char* Names[] = {"Inf", "Random"};
};

template <ValueE E>
struct Value {};

template <>
struct Value<ValueE::Inf> {
  template <class F>
  static std::array<F, 1000> make_data() {
    std::array<F, 1000> result;
    std::fill(result.begin(), result.end(), -std::numeric_limits<F>::infinity());
    return result;
  }
};

template <>
struct Value<ValueE::Random> {
  template <class F>
  static std::array<F, 1000> make_data() {
    std::random_device seed;
    std::mt19937 generator(seed());
    std::uniform_int_distribution<std::conditional_t<sizeof(F) == sizeof(uint32_t), uint32_t, uint64_t>> distribution;

    std::array<F, 1000> result;
    std::generate(result.begin(), result.end(), [&] {
      while (true) {
        auto result = std::bit_cast<F>(distribution(generator));
        if (std::isfinite(result))
          return result;
      }
    });
    return result;
  }
};

// *** Display Type ***
enum class DisplayTypeE {
  Default,
  Hex,
  Scientific,
  Fixed,
  General,
};
struct AllDisplayTypes : EnumValuesAsTuple<AllDisplayTypes, DisplayTypeE, 5> {
  static constexpr const char* Names[] = {"DisplayDefault", "DisplayHex", "DisplayScientific", "DisplayFixed",
                                          "DisplayGeneral"};
};

template <DisplayTypeE E>
struct DisplayType {};

template <>
struct DisplayType<DisplayTypeE::Default> {
  static constexpr const char* fmt = "";
};

template <>
struct DisplayType<DisplayTypeE::Hex> {
  static constexpr const char* fmt = "a";
};

template <>
struct DisplayType<DisplayTypeE::Scientific> {
  static constexpr const char* fmt = "e";
};

template <>
struct DisplayType<DisplayTypeE::Fixed> {
  static constexpr const char* fmt = "f";
};

template <>
struct DisplayType<DisplayTypeE::General> {
  static constexpr const char* fmt = "g";
};

// *** Alignment ***
enum class AlignmentE { None, Left, Center, Right, ZeroPadding };
struct AllAlignments : EnumValuesAsTuple<AllAlignments, AlignmentE, 5> {
  static constexpr const char* Names[] = {"AlignNone", "AlignmentLeft", "AlignmentCenter", "AlignmentRight",
                                          "ZeroPadding"};
};

template <AlignmentE E>
struct Alignment {};

template <>
struct Alignment<AlignmentE::None> {
  static constexpr const char* fmt = "";
};

template <>
struct Alignment<AlignmentE::Left> {
  // Width > PrecisionE::Huge
  static constexpr const char* fmt = "0<17500";
};

template <>
struct Alignment<AlignmentE::Center> {
  // Width > PrecisionE::Huge
  static constexpr const char* fmt = "0^17500";
};

template <>
struct Alignment<AlignmentE::Right> {
  // Width > PrecisionE::Huge
  static constexpr const char* fmt = "0>17500";
};

template <>
struct Alignment<AlignmentE::ZeroPadding> {
  // Width > PrecisionE::Huge
  static constexpr const char* fmt = "017500";
};

enum class PrecisionE { None, Zero, Small, Huge };
struct AllPrecisions : EnumValuesAsTuple<AllPrecisions, PrecisionE, 4> {
  static constexpr const char* Names[] = {"PrecNone", "PrecZero", "PrecSmall", "PrecHuge"};
};

template <PrecisionE E>
struct Precision {};

template <>
struct Precision<PrecisionE::None> {
  static constexpr const char* fmt = "";
};

template <>
struct Precision<PrecisionE::Zero> {
  static constexpr const char* fmt = ".0";
};

template <>
struct Precision<PrecisionE::Small> {
  static constexpr const char* fmt = ".10";
};

template <>
struct Precision<PrecisionE::Huge> {
  // The maximum precision for a minimal sub normal long double is +/- 0x1p-16494.
  // This value is always larger than that value forcing the trailing zero path
  // to be executed.
  static constexpr const char* fmt = ".17000";
};

template <class L, class DT, class T, class V, class A, class P>
struct FloatingPoint {
  using F = typename Type<T::value>::type;

  void run(benchmark::State& state) const {
    std::array<F, 1000> data{Value<V::value>::template make_data<F>()};
    std::array<char, 20'000> output;

    while (state.KeepRunningBatch(1000))
      for (F value : data)
        benchmark::DoNotOptimize(std::format_to(output.begin(), std::string_view{fmt.data(), fmt.size()}, value));
  }

  std::string name() const {
    return "FloatingPoint" + L::name() + DT::name() + T::name() + V::name() + A::name() + P::name();
  }

  static constexpr std::string make_fmt() {
    return std::string("{:") + Alignment<A::value>::fmt + Precision<P::value>::fmt + Localization<L::value>::fmt +
           DisplayType<DT::value>::fmt + "}";
  }

  static constexpr auto fmt = []() {
    constexpr size_t s = make_fmt().size();
    std::array<char, s> r;
    std::ranges::copy(make_fmt(), r.begin());
    return r;
  }();
};

int main(int argc, char** argv) {
  benchmark::Initialize(&argc, argv);
  if (benchmark::ReportUnrecognizedArguments(argc, argv))
    return 1;

  makeCartesianProductBenchmark<FloatingPoint, AllLocalizations, AllDisplayTypes, AllTypes, AllValues, AllAlignments,
                                AllPrecisions>();

  benchmark::RunSpecifiedBenchmarks();
}
