#pragma once

#include <map>
#include <iomanip>
#include <sstream>

#include "katom.h"
#include "locator.h"

class Target
{
public:
    Target() = default;
//    Target(std::vector<Katom>::iterator begin, std::vector<Katom>::iterator end, Argtype_set argtypes);
    Target(std::string name, std::string desc, Locator loc)
        : m_name(name)
        , m_desc(desc)
        , m_loc(loc)
        {};

    void add_transform(std::string original, std::string transformed);
    void add_transforms(std::string transforms);
    void add_transforms(std::vector<std::pair<std::string, std::string>> transforms);
    void transform(std::vector<Katom>& katoms);

    void add_escapes(std::string escape_spec);
    std::string escape_text(std::string text) const;
    std::string unescape_text(std::string text) const;
    std::string resolve_escapes(std::string text) const;
    static std::string escape_marker(const std::string& ch);

    void add_after_apply(std::string function_specs);

    std::string m_name {};
    std::string m_desc {};
    std::vector<std::string> m_includes {};
    std::vector<std::string> m_provides {};
    std::vector<std::string> m_after_apply {};

    Locator m_loc {};
    std::vector<std::pair<std::string, std::string>> m_transforms {};
    std::vector<std::pair<std::string, std::string>> m_escapes {};
//    Argtype_set m_argtypes {};


};

std::vector<std::pair<std::string, std::string>>
parse_transforms(std::string transform_string);
