#include "MarkdownContentParser.h"

void MarkdownContentParser::run(const Path& path)
{
    FileMetadata metadata;

    const auto lines = File(path).readLines();
    bool metadata_finished = false;
    for (const auto& line : lines)
    {
        if (!metadata_finished)
        {
            const auto metadata = checkForMetadataItem(line);
            if (!metadata)
            {
                metadata_finished = true;
                mContentBody.push_back(line);
            }
            else
            {
                mMetadata[metadata->first] = metadata->second;
            }
        }
        else
        {
            mContentBody.push_back(line);
        }
    }
}

MarkdownContentParser::FileContentBody MarkdownContentParser::getContentBody() const
{
    return mContentBody;
}

MarkdownContentParser::FileMetadata MarkdownContentParser::getFileMetadata() const
{
    return mMetadata;
}

std::optional<MarkdownContentParser::FileMetadataItem> MarkdownContentParser::checkForMetadataItem(const std::string& line) const
{
    unsigned char_count = 0;
    std::string prefix;
    std::string suffix;
    bool building_prefix = true;
    for (const auto c : line)
    {
        if (c == ':' && char_count > 0 && building_prefix)
        {
            building_prefix = false;
        }
        else if (building_prefix)
        {
            prefix += c;
        }
        else
        {
            suffix += c;
        }
        char_count++;
    }

    if (!prefix.empty() && !building_prefix)
    {
        return FileMetadataItem{ prefix, suffix };
    }
    else
    {
        return std::nullopt;
    }
}