⛏️ index : haiku.git

/*
 * Copyright 2024-2025, Andrew Lindesay <apl@lindesay.co.nz>.
 * All rights reserved. Distributed under the terms of the MIT License.
 */


#include "PackageUserRatingInfo.h"


PackageUserRatingInfo::PackageUserRatingInfo()
	:
	fUserRatings(),
	fSummary(),
	fUserRatingsPopulated(false)
{
}


PackageUserRatingInfo::PackageUserRatingInfo(const PackageUserRatingInfo& other)
	:
	fSummary(other.Summary()),
	fUserRatingsPopulated(other.UserRatingsPopulated())
{
	for (int32 i = CountUserRatings() - 1; i >= 0; i--)
		AddUserRating(other.UserRatingAtIndex(i));
}


const UserRatingSummaryRef
PackageUserRatingInfo::Summary() const
{
	return fSummary;
}


void
PackageUserRatingInfo::SetSummary(UserRatingSummaryRef value)
{
	fSummary = value;
}


void
PackageUserRatingInfo::SetUserRatingsPopulated()
{
	fUserRatingsPopulated = true;
}


bool
PackageUserRatingInfo::UserRatingsPopulated() const
{
	return fUserRatingsPopulated;
}


int32
PackageUserRatingInfo::CountUserRatings() const
{
	return fUserRatings.size();
}


const UserRatingRef
PackageUserRatingInfo::UserRatingAtIndex(int32 index) const
{
	return fUserRatings[index];
}


void
PackageUserRatingInfo::AddUserRating(const UserRatingRef& rating)
{
	fUserRatings.push_back(rating);
}


bool
PackageUserRatingInfo::operator==(const PackageUserRatingInfo& other) const
{
	if (Summary() != other.Summary())
		return false;

	if (UserRatingsPopulated() != other.UserRatingsPopulated())
		return false;

	if (CountUserRatings() != other.CountUserRatings())
		return false;

	for (int32 i = CountUserRatings() - 1; i >= 0; i--) {
		if (other.UserRatingAtIndex(i) != UserRatingAtIndex(i))
			return false;
	}

	return true;
}


bool
PackageUserRatingInfo::operator!=(const PackageUserRatingInfo& other) const
{
	return !(*this == other);
}


// #pragma mark - PackageUserRatingInfoBuilder


PackageUserRatingInfoBuilder::PackageUserRatingInfoBuilder()
	:
	fSource(),
	fUserRatings(),
	fSummary(),
	fUserRatingsPopulated(false)
{
}


PackageUserRatingInfoBuilder::PackageUserRatingInfoBuilder(const PackageUserRatingInfoRef& other)
	:
	fSource(other),
	fUserRatings(),
	fSummary(),
	fUserRatingsPopulated(false)
{
}


PackageUserRatingInfoBuilder::~PackageUserRatingInfoBuilder()
{
}


PackageUserRatingInfoRef
PackageUserRatingInfoBuilder::BuildRef()
{
	if (fSource.IsSet())
		return fSource;

	PackageUserRatingInfo* userRatingInfo = new PackageUserRatingInfo();

	userRatingInfo->SetSummary(fSummary);

	if (fUserRatingsPopulated)
		userRatingInfo->SetUserRatingsPopulated();

	std::vector<UserRatingRef>::const_iterator it;
	for (it = fUserRatings.begin(); it != fUserRatings.end(); it++)
		userRatingInfo->AddUserRating(*it);

	return PackageUserRatingInfoRef(userRatingInfo, true);
}


PackageUserRatingInfoBuilder&
PackageUserRatingInfoBuilder::AddUserRating(const UserRatingRef& rating)
{
	if (fSource.IsSet())
		_InitFromSource();
	fUserRatings.push_back(rating);
	return *this;
}


PackageUserRatingInfoBuilder&
PackageUserRatingInfoBuilder::WithSummary(UserRatingSummaryRef value)
{
	if (!fSource.IsSet() || fSource->Summary() != value) {
		_InitFromSource();
		fSummary = value;
	}
	return *this;
}


PackageUserRatingInfoBuilder&
PackageUserRatingInfoBuilder::WithUserRatingsPopulated()
{
	if (!fSource.IsSet() || !fSource->UserRatingsPopulated()) {
		_InitFromSource();
		fUserRatingsPopulated = true;
	}
	return *this;
}


void
PackageUserRatingInfoBuilder::_InitFromSource()
{
	if (fSource.IsSet()) {
		_Init(fSource.Get());
		fSource.Unset();
	}
}


void
PackageUserRatingInfoBuilder::_Init(const PackageUserRatingInfo* value)
{
	fSummary = value->Summary();
	fUserRatingsPopulated = value->UserRatingsPopulated();

	int32 count = value->CountUserRatings();
	for (int32 i = 0; i < count; i++)
		fUserRatings.push_back(value->UserRatingAtIndex(i));
}