#pragma once

#include <iostream>
#include <string>
// #include <filesystem>
#include <source_location>
#include <map>

#include "file.h"

inline std::string klammertext_home_var = "KLAMMERTEXT_HOME";

class Locator
{
public:
    explicit Locator(const std::source_location location =
                     std::source_location::current())
        // std::source_location::file_name() can return nullptr on some
        // toolchains (e.g. Homebrew GCC on macOS); guard against
        // fs::path(nullptr) -> strlen(NULL).
        : m_filename(location.file_name()
                     ? fs::absolute(location.file_name()) : fs::path{})
        , m_line(int(location.line()))
        , m_chr(int(location.column()))
        {};
    Locator(const fs::path& filename, int line, int chr);
    // "No location": for errors with no document position -- command-line
    // argument errors, lookups made on the command's behalf.  NOT the same
    // as Locator(): the default constructor captures the C++ CALL SITE via
    // std::source_location (and a defaulted Locator parameter captures the
    // CALLER), which is what leaked "argv.cpp, line 597" into user-facing
    // errors (found by the error gallery, 2026-08-22).  Locator() is for
    // logging; errors either carry a real document location or this.
    static Locator none() { return Locator(fs::path{}, -1, -1); }
    std::string str(bool relative = false) const;
    std::string desc(bool relative = false) const;
    std::string abbrev(bool include_chr=true) const;

    std::string m_filename {};
    int m_line;
    int m_chr;
    //std::string m_desc {};
};

std::ostream &nformat(std::ostream &os);

std::string locator_range(
    const Locator& start_loc, const Locator& end_loc,
    std::map<std::string, std::string>& relpath);

Locator current_locator(
    const std::source_location location = std::source_location::current());

std::string locator_summary(std::vector<Locator> locators);

inline
std::string showloc(Locator loc=Locator()) {
    return loc.abbrev(false) + " ";
}

