root/src/kits/package/solver/SolverProblem.cpp
/*
 * Copyright 2013, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Ingo Weinhold <ingo_weinhold@gmx.de>
 */


#include <Catalog.h>

#include <package/solver/SolverProblem.h>

#include <package/solver/SolverPackage.h>
#include <package/solver/SolverProblemSolution.h>


#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "SolverProblem"


static const char* const kToStringTexts[] = {
        B_TRANSLATE_MARK("unspecified problem"),
        B_TRANSLATE_MARK("%source% does not belong to a distupgrade repository"),
        B_TRANSLATE_MARK("%source% has inferior architecture"),
        B_TRANSLATE_MARK("problem with installed package %source%"),
        B_TRANSLATE_MARK("conflicting requests"),
        B_TRANSLATE_MARK("nothing provides requested %dependency%"),
        B_TRANSLATE_MARK("%dependency% is provided by the system"),
        B_TRANSLATE_MARK("dependency problem"),
        B_TRANSLATE_MARK("package %source% is not installable"),
        B_TRANSLATE_MARK("nothing provides %dependency% needed by %source%"),
        B_TRANSLATE_MARK("cannot install both %source% and %target%"),
        B_TRANSLATE_MARK("package %source% conflicts with %dependency% provided "
                "by %target%"),
        B_TRANSLATE_MARK("package %source% obsoletes %dependency% provided by "
                "%target%"),
        B_TRANSLATE_MARK("installed package %source% obsoletes %dependency% "
                "provided by %target%"),
        B_TRANSLATE_MARK("package %source% implicitly obsoletes %dependency% "
                "provided by %target%"),
        B_TRANSLATE_MARK("package %source% requires %dependency%, but none of the "
                "providers can be installed"),
        B_TRANSLATE_MARK("package %source% conflicts with %dependency% provided by "
                "itself")
};


namespace BPackageKit {


BSolverProblem::BSolverProblem(BType type, BSolverPackage* sourcePackage,
        BSolverPackage* targetPackage)
        :
        fType(type),
        fSourcePackage(sourcePackage),
        fTargetPackage(targetPackage),
        fDependency(),
        fSolutions(10)
{
}


BSolverProblem::BSolverProblem(BType type, BSolverPackage* sourcePackage,
        BSolverPackage* targetPackage,
        const BPackageResolvableExpression& dependency)
        :
        fType(type),
        fSourcePackage(sourcePackage),
        fTargetPackage(targetPackage),
        fDependency(dependency),
        fSolutions(10)
{
}


BSolverProblem::~BSolverProblem()
{
}


BSolverProblem::BType
BSolverProblem::Type() const
{
        return fType;
}


BSolverPackage*
BSolverProblem::SourcePackage() const
{
        return fSourcePackage;
}


BSolverPackage*
BSolverProblem::TargetPackage() const
{
        return fTargetPackage;
}


const BPackageResolvableExpression&
BSolverProblem::Dependency() const
{
        return fDependency;
}


int32
BSolverProblem::CountSolutions() const
{
        return fSolutions.CountItems();
}


const BSolverProblemSolution*
BSolverProblem::SolutionAt(int32 index) const
{
        return fSolutions.ItemAt(index);
}


bool
BSolverProblem::AppendSolution(BSolverProblemSolution* solution)
{
        return fSolutions.AddItem(solution);
}


BString
BSolverProblem::ToString() const
{
        size_t index = fType;
        if (index >= sizeof(kToStringTexts) / sizeof(kToStringTexts[0]))
                index = 0;

        return BString(B_TRANSLATE_NOCOLLECT(kToStringTexts[index]))
                .ReplaceAll("%source%",
                        fSourcePackage != NULL 
                                ? fSourcePackage->VersionedName().String() : "?")
                .ReplaceAll("%target%",
                        fTargetPackage != NULL
                                ? fTargetPackage->VersionedName().String() : "?")
                .ReplaceAll("%dependency%",
                        fDependency.InitCheck() == B_OK
                                ? fDependency.ToString().String() : "?");
}


}       // namespace BPackageKit