#include <prjxray/segbits_file_reader.h>

namespace prjxray {

std::unique_ptr<SegbitsFileReader> SegbitsFileReader::InitWithFile(
    const std::string& path) {
	auto mapped_file = MemoryMappedFile::InitWithFile(path);
	if (!mapped_file)
		return nullptr;

	return std::unique_ptr<SegbitsFileReader>(
	    new SegbitsFileReader(std::move(mapped_file)));
}

SegbitsFileReader::iterator SegbitsFileReader::begin() {
	return iterator(
	    absl::string_view(static_cast<const char*>(mapped_file_->data()),
	                      mapped_file_->size()));
}

SegbitsFileReader::iterator SegbitsFileReader::end() {
	return iterator(absl::string_view());
}

SegbitsFileReader::value_type::value_type(const absl::string_view& view) {
	size_t separator_start = view.find_first_of(" \t\n");
	if (separator_start == absl::string_view::npos) {
		tag_ = view;
		bit_ = absl::string_view();
		return;
	}

	size_t bit_start = view.find_first_not_of(" \t", separator_start);
	size_t newline = view.find('\n', bit_start);
	if (newline == absl::string_view::npos) {
		tag_ = view.substr(0, separator_start);
		bit_ = view.substr(bit_start);
		return;
	}

	size_t bit_len = newline - bit_start;
	tag_ = view.substr(0, separator_start);
	bit_ = view.substr(bit_start, bit_len);
	return;
}

SegbitsFileReader::iterator& SegbitsFileReader::iterator::operator++() {
	size_t newline = view_.find('\n');
	if (newline == absl::string_view::npos) {
		view_ = absl::string_view();
	}

	view_.remove_prefix(newline + 1);
	value_ = value_type(view_);
	return *this;
}

}  // namespace prjxray
