root/src/apps/haikudepot/packagemodel/PackageUserRatingInfo.cpp
/*
 * 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));
}