#ifndef PRJXRAY_LIB_XILINX_XCUPSERIES_CONFIGURATION_COLUMN_H_
#define PRJXRAY_LIB_XILINX_XCUPSERIES_CONFIGURATION_COLUMN_H_

#include <algorithm>
#include <cassert>

#include <absl/types/optional.h>
#include <prjxray/xilinx/xcupseries/frame_address.h>
#include <yaml-cpp/yaml.h>

namespace prjxray {
namespace xilinx {
namespace xcupseries {

// ConfigurationColumn represents an endpoint on a ConfigurationBus.
class ConfigurationColumn {
       public:
	ConfigurationColumn() = default;
	ConfigurationColumn(unsigned int frame_count)
	    : frame_count_(frame_count) {}

	// Returns a ConfigurationColumn that describes a continguous range of
	// minor addresses that encompasses the given
	// FrameAddresses.  The provided addresses must only
	// differ only by their minor addresses.
	template <typename T>
	ConfigurationColumn(T first, T last);

	// Returns true if the minor field of the address is within the valid
	// range of this column.
	bool IsValidFrameAddress(FrameAddress address) const;

	// Returns the next address in numerical order.  If the next address
	// would be outside this column, return no object.
	absl::optional<FrameAddress> GetNextFrameAddress(
	    FrameAddress address) const;

       private:
	friend struct YAML::convert<ConfigurationColumn>;

	unsigned int frame_count_;
};

template <typename T>
ConfigurationColumn::ConfigurationColumn(T first, T last) {
	assert(
	    std::all_of(first, last, [&](const typename T::value_type& addr) {
		    return (addr.block_type() == first->block_type() &&
		            addr.is_bottom_half_rows() ==
		                first->is_bottom_half_rows() &&
		            addr.row() == first->row() &&
		            addr.column() == first->column());
	    }));

	auto max_minor = std::max_element(
	    first, last, [](const FrameAddress& lhs, const FrameAddress& rhs) {
		    return lhs.minor() < rhs.minor();
	    });

	frame_count_ = max_minor->minor() + 1;
}

}  // namespace xcupseries
}  // namespace xilinx
}  // namespace prjxray

namespace YAML {
template <>
struct convert<prjxray::xilinx::xcupseries::ConfigurationColumn> {
	static Node encode(
	    const prjxray::xilinx::xcupseries::ConfigurationColumn& rhs);
	static bool decode(
	    const Node& node,
	    prjxray::xilinx::xcupseries::ConfigurationColumn& lhs);
};
}  // namespace YAML

#endif  // PRJXRAY_LIB_XILINX_XCUPSERIES_CONFIGURATION_COLUMN_H_
