#include "error.h"
#include "show.h"
#include "util.h"
#include "file.h"

bool display_source(const std::string& filename_arg)
{
    if (filename_arg.empty()) {
        return false;
    } else {
        fs::path filename = fs::path(filename_arg).filename();
        return sks_commands.count(filename) == 0;
    }
}

void Error::print_message(const std::string& epilog)
{
    // The separator is not cosmetic: the description ends with a sentence, and
    // appending the advice straight onto it ran the two together into one word
    // ("...for an unspecified targetkdiag loads no klammerset...").  m_desc is
    // then justified to 80 columns, so the break has to be a blank line rather
    // than a single newline, which justify() would fold back into the flow.
    if (epilog != "") {
        m_desc += "\n\n" + epilog + "\n";
    }
    m_desc = justify(m_desc, 80, 0);
    std::cerr << "\n" << red << command_name << " (" << m_type << " error)";
    if (display_source(m_loc.m_filename)) {
        std::cerr << ":\n  " << m_loc.m_filename;
    }
    if (m_loc.m_line > -1) {
        std::cerr << ", line " << m_loc.m_line;
    }
    if (m_loc.m_chr > -1) {
        std::cerr << ", character " << m_loc.m_chr + 1;
    }
    std::cerr << ":\n\n" << m_desc << reset << "\n";
}
