#pragma once

#include "ccl/Operation.hpp"
#include "ccl/oss/Pict.hpp"

//! Text descriptions of ccl entities for user
namespace xtr::info {

enum class ErrorType : uint32_t {
  UNKNOWN,
  LEXER,
  PARSER,
  SEMANTIC,
  VALUE,
};

enum class CoreStatus : uint8_t { 
  CORRECT, 
  WARNING, 
  INCORRECT 
};

enum class ModelStatus : uint8_t { 
  CORRECT, 
  WARNING, 
  INCORRECT 
};

[[nodiscard]] CoreStatus StatusOf(const ccl::semantic::RSCore& core);
[[nodiscard]] ModelStatus StatusOf(const ccl::semantic::RSModel& target);

[[nodiscard]] CString ValueStatus(EntityUID target, const ccl::semantic::RSModel& model);

[[nodiscard]] CString LabelBool(bool flag);
[[nodiscard]] CString Label(ccl::ops::Type type);
[[nodiscard]] CString Label(ccl::ops::Status status);
[[nodiscard]] CString Label(CoreStatus status);
[[nodiscard]] CString Label(ModelStatus status);
[[nodiscard]] CString Label(ccl::src::SrcType type);
[[nodiscard]] CString Label(ccl::lang::Grammem gram);
[[nodiscard]] CString Label(const ccl::rslang::ExpressionType* type);
[[nodiscard]] CString Label(ccl::rslang::ValueClass cls);

[[nodiscard]] CString DrawableLabel(ccl::ops::Status status);

[[nodiscard]] CString IndicatorFor(const ccl::semantic::RSCore& core);
[[nodiscard]] CString BasicDescriptionOf(const ccl::semantic::RSCore& core);
[[nodiscard]] CString DescriptionOf(const ccl::semantic::RSCore& core);
[[nodiscard]] CString DescriptionOf(ccl::lang::Grammem gram);

[[nodiscard]] CString IndicatorFor(const ccl::semantic::RSModel& model);
[[nodiscard]] CString BasicDescriptionOf(const ccl::semantic::RSModel& model);
[[nodiscard]] CString DescriptionOf(const ccl::semantic::RSModel& model);

[[nodiscard]] CString BasicDescriptionOf(ccl::oss::PictID pict, ccl::oss::OSSchema& oss);

[[nodiscard]] CString DescriptionOf(const ccl::rslang::Auditor& analytics, BOOL showAST);
[[nodiscard]] CString DescriptionOf(const ccl::rslang::Interpreter& calculator,
                                    const std::optional<ccl::rslang::ExpressionValue>& result,
                                    BOOL showAST);
[[nodiscard]] CString DescriptionOf(const ccl::lang::Reference& ref);
[[nodiscard]] CString DescriptionOf(ccl::oss::ossOperationsFacet& ops, ccl::oss::PictID pid);
[[nodiscard]] CString DescriptionOf(const ccl::StrSubstitutes& substitutes);

[[nodiscard]] CString DescriptionOf(const ccl::rslang::ErrorLogger& log);
[[nodiscard]] CString DescriptionOf(const ccl::rslang::Error& error);
[[nodiscard]] CString Label(ErrorType type);

[[nodiscard]] CString GenerateLoopStr(const ccl::semantic::RSCore& schema, const std::vector<ccl::SetOfEntities>& loops);

}// namespace xtr::info
