root/src/apps/haikudepot/packagemodel/PackageFilterSpecification.h
/*
 * Copyright 2025, Andrew Lindesay <apl@lindesay.co.nz>.
 * All rights reserved. Distributed under the terms of the MIT License.
 */
#ifndef PACKAGE_FILTER_SPECIFICATION_H
#define PACKAGE_FILTER_SPECIFICATION_H

#include <Referenceable.h>
#include <String.h>


/*!     Instances of this class should not be created directly; instead use the
        PackageFilterSpecificationBuilder class as a builder-constructor.
*/
class PackageFilterSpecification : public BReferenceable
{
friend class PackageFilterSpecificationBuilder;

public:
                                                                PackageFilterSpecification();
        virtual                                         ~PackageFilterSpecification();

                        bool                            operator==(const PackageFilterSpecification& other) const;
                        bool                            operator!=(const PackageFilterSpecification& other) const;

                        BString                         SearchTerms() const;
                        BString                         DepotName() const;
                        BString                         Category() const;
                        bool                            ShowOnlyDesktopPackages() const;
                        bool                            ShowOnlyNativeDesktopPackages() const;
                        bool                            ShowAvailablePackages() const;
                        bool                            ShowInstalledPackages() const;
                        bool                            ShowSourcePackages() const;
                        bool                            ShowDevelopPackages() const;

private:
                        void                            SetSearchTerms(BString value);
                        void                            SetDepotName(BString value);
                        void                            SetCategory(BString value);
                        void                            SetShowOnlyDesktopPackages(bool value);
                        void                            SetShowOnlyNativeDesktopPackages(bool value);
                        void                            SetShowAvailablePackages(bool value);
                        void                            SetShowInstalledPackages(bool value);
                        void                            SetShowSourcePackages(bool value);
                        void                            SetShowDevelopPackages(bool value);

private:
                        BString                         fSearchTerms;
                        BString                         fDepotName;
                        BString                         fCategory;
                        bool                            fShowOnlyDesktopPackages;
                        bool                            fShowOnlyNativeDesktopPackages;
                        bool                            fShowAvailablePackages;
                        bool                            fShowInstalledPackages;
                        bool                            fShowSourcePackages;
                        bool                            fShowDevelopPackages;
};


typedef BReference<PackageFilterSpecification> PackageFilterSpecificationRef;


class PackageFilterSpecificationBuilder
{
public:
                                                                PackageFilterSpecificationBuilder();
                                                                PackageFilterSpecificationBuilder(
                                                                        const PackageFilterSpecificationRef& other);
        virtual                                         ~PackageFilterSpecificationBuilder();

                        PackageFilterSpecificationRef
                                                                BuildRef();

                        PackageFilterSpecificationBuilder
                                                                WithSearchTerms(BString value);
                        PackageFilterSpecificationBuilder
                                                                WithDepotName(BString value);
                        PackageFilterSpecificationBuilder
                                                                WithCategory(BString value);
                        PackageFilterSpecificationBuilder
                                                                WithShowOnlyDesktopPackages(bool value);
                        PackageFilterSpecificationBuilder
                                                                WithShowOnlyNativeDesktopPackages(bool value);
                        PackageFilterSpecificationBuilder
                                                                WithShowAvailablePackages(bool value);
                        PackageFilterSpecificationBuilder
                                                                WithShowInstalledPackages(bool value);
                        PackageFilterSpecificationBuilder
                                                                WithShowSourcePackages(bool value);
                        PackageFilterSpecificationBuilder
                                                                WithShowDevelopPackages(bool value);

private:
                        void                            _InitFromSource();
                        void                            _Init(const PackageFilterSpecification* value);

private:
                        PackageFilterSpecificationRef
                                                                fSource;
                        BString                         fSearchTerms;
                        BString                         fDepotName;
                        BString                         fCategory;
                        bool                            fShowOnlyDesktopPackages;
                        bool                            fShowOnlyNativeDesktopPackages;
                        bool                            fShowAvailablePackages;
                        bool                            fShowInstalledPackages;
                        bool                            fShowSourcePackages;
                        bool                            fShowDevelopPackages;
};


#endif // PACKAGE_FILTER_SPECIFICATION_H