// See the file "COPYING" in the main distribution directory for copyright.

#include "zeek/zeekygen/ReStructuredTextTable.h"

#include <cassert>

using namespace std;

namespace zeek::zeekygen::detail {

ReStructuredTextTable::ReStructuredTextTable(size_t arg_num_cols)
    : num_cols(arg_num_cols), rows(), longest_row_in_column() {
    for ( size_t i = 0; i < num_cols; ++i )
        longest_row_in_column.push_back(1);
}

void ReStructuredTextTable::AddRow(const vector<string>& new_row) {
    assert(new_row.size() == num_cols);
    rows.push_back(new_row);

    for ( size_t i = 0; i < new_row.size(); ++i )
        if ( new_row[i].size() > longest_row_in_column[i] )
            longest_row_in_column[i] = new_row[i].size();
}

string ReStructuredTextTable::MakeBorder(const vector<size_t>& col_sizes, char border) {
    string rval;

    for ( size_t i = 0; i < col_sizes.size(); ++i ) {
        if ( i > 0 )
            rval += " ";

        rval += string(col_sizes[i], border);
    }

    rval += "\n";
    return rval;
}

string ReStructuredTextTable::AsString(char border) const {
    string rval = MakeBorder(longest_row_in_column, border);

    for ( const auto& row : rows ) {
        for ( size_t col = 0; col < num_cols; ++col ) {
            if ( col > 0 ) {
                size_t last = row[col - 1].size();
                size_t longest = longest_row_in_column[col - 1];
                size_t whitespace = longest - last + 1;
                rval += string(whitespace, ' ');
            }

            rval += row[col];
        }

        rval += "\n";
    }

    rval += MakeBorder(longest_row_in_column, border);
    return rval;
}

} // namespace zeek::zeekygen::detail
