#pragma once

#include <string>
#include <vector>

#include "util.h"      // strings_t

#include "locator.h"

// A Klammerset is the formal construct declared by the @@@klammerset system
// command: a named, logically related group of klammer definitions loaded
// together.  The instance holds metadata and the file list only -- the
// klammers themselves live in the Machine's Klammer_registry (one flat,
// additive namespace; the definition modes govern collisions).  Membership
// is provenance, not containment.
class Klammerset
{
public:
    Klammerset() = default;
    Klammerset(const std::string& symbol, const std::string& desc, const Locator& loc);

    std::string m_symbol {};   // registry key and command-line name (e.g. "sks")
    std::string m_desc {};     // the logical relationship that makes this a set
    std::string m_name {};     // display name (e.g. "Standard Klammer Set")
    std::string m_author {};
    std::string m_date {};     // last update; a date serves as the version
    std::vector<std::string> m_requires {};  // klammerset declaration files, loaded first
    std::vector<std::string> m_files {};     // definition files, loaded in list order
    Locator m_loc {};          // the declaring file; relative names resolve against it
    // Every file this set actually read, as a canonical path: the declaring
    // file itself (a set may define klammers before or after its declaration)
    // followed by the resolved :requires and :files.  m_files holds the names
    // as WRITTEN, which cannot be compared against a definition's location;
    // this holds what was opened.  It is what lets a display tell a klammer
    // that came from a klammerset apart from one the input defined.
    strings_t m_loaded_files {};
};
