/* Copyright (C) 2023 FIAS Frankfurt Institute for Advanced Studies, Frankfurt / Main
   SPDX-License-Identifier: GPL-3.0-only
   Authors: Felix Weiglhofer [committer] */
#ifndef CBM_BASE_TYPES_H
#define CBM_BASE_TYPES_H

#include "MicrosliceDescriptor.hpp"  // For fles::Subsystem
#include "util/EnumDict.h"

#include <cstdint>

namespace cbm::algo
{

  // typealias for Rust-like fixed size integer types
  using i8  = std::int8_t;
  using u8  = std::uint8_t;
  using i16 = std::int16_t;
  using u16 = std::uint16_t;
  using i32 = std::int32_t;
  using u32 = std::uint32_t;
  using i64 = std::int64_t;
  using u64 = std::uint64_t;
  using f32 = float;
  using f64 = double;

#ifdef CBM_ALGO_REAL64
  using real = f64;
#else
  using real = f32;
#endif

  enum class Step
  {
    Unpack,
    DigiTrigger,
    LocalReco,
    Tracking,
  };

  enum class RecoData
  {
    DigiTimeslice,  //< Raw output from unpackers
    DigiEvent,      //< Digis after event building
    Cluster,
    Hit,
    Track,
  };

  enum class Setup
  {
    mCBM2022,
    mCBM2024_03,
    mCBM2024_05,
  };

}  // namespace cbm::algo

CBM_ENUM_DICT(fles::Subsystem,
  // CBM detectors
  {"STS", fles::Subsystem::STS},
  {"MVD", fles::Subsystem::MVD},
  {"RICH", fles::Subsystem::RICH},
  {"TRD", fles::Subsystem::TRD},
  {"TRD2D", fles::Subsystem::TRD2D},
  {"MUCH", fles::Subsystem::MUCH},
  {"TOF", fles::Subsystem::TOF},

  // Other detectors (experimental)
  {"ECAL", fles::Subsystem::ECAL},
  {"PSD", fles::Subsystem::PSD},
  {"BMON", fles::Subsystem::BMON},
  {"TRB3", fles::Subsystem::TRB3},
  {"Hodoscope", fles::Subsystem::Hodoscope},
  {"Cherenkov", fles::Subsystem::Cherenkov},
  {"LeadGlass", fles::Subsystem::LeadGlass},

  // FLES (pattern generators)
  {"FLES", fles::Subsystem::FLES},
);

CBM_ENUM_DICT(cbm::algo::Step,
  {"Unpack", Step::Unpack},
  {"DigiTrigger", Step::DigiTrigger},
  {"LocalReco", Step::LocalReco},
  {"Tracking", Step::Tracking}
);

CBM_ENUM_DICT(cbm::algo::RecoData,
  {"DigiTimeslice", RecoData::DigiTimeslice},
  {"DigiEvent", RecoData::DigiEvent},
  {"Cluster", RecoData::Cluster},
  {"Hit", RecoData::Hit},
  {"Track", RecoData::Track}
);

CBM_ENUM_DICT(cbm::algo::Setup,
  {"mCBM2022", cbm::algo::Setup::mCBM2022},
  {"mCBM2024_03", cbm::algo::Setup::mCBM2024_03},
  {"mCBM2024_05", cbm::algo::Setup::mCBM2024_05}
);

#endif