// SPDX-License-Identifier: LGPL-2.1-or-later
//
// SPDX-FileCopyrightText: 2008 Patrick Spendrin <ps_ml@gmx.de>
//

#ifndef MARBLE_GEODATAMULTIGEOMETRY_H
#define MARBLE_GEODATAMULTIGEOMETRY_H

#include "geodata_export.h"

#include "GeoDataGeometry.h"
#include <QList>

namespace Marble
{

class GeoDataMultiGeometryPrivate;

/**
 * @short A class that can contain other GeoDataGeometry objects
 *
 * GeoDataMultiGeometry is a collection of other GeoDataGeometry objects.
 * As one can add GeoDataMultiGeometry to itself, you can make up a collection
 * of different objects to form one Placemark.
 */
class GEODATA_EXPORT GeoDataMultiGeometry : public GeoDataGeometry
{
public:
    GeoDataMultiGeometry();
    explicit GeoDataMultiGeometry(const GeoDataGeometry &other);

    ~GeoDataMultiGeometry() override;

    const char *nodeType() const override;

    EnumGeometryId geometryId() const override;

    GeoDataGeometry *copy() const override;

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

    const GeoDataLatLonAltBox &latLonAltBox() const override;

    int size() const;
    GeoDataGeometry &at(int pos);
    const GeoDataGeometry &at(int pos) const;
    GeoDataGeometry &operator[](int pos);
    const GeoDataGeometry &operator[](int pos) const;

    GeoDataGeometry &first();
    const GeoDataGeometry &first() const;
    GeoDataGeometry &last();
    const GeoDataGeometry &last() const;

    /**
     * @brief  returns the requested child item
     */
    GeoDataGeometry *child(int);

    /**
     * @brief  returns the requested child item
     */
    const GeoDataGeometry *child(int) const;

    /**
     * @brief returns the position of an item in the list
     */
    int childPosition(const GeoDataGeometry *child) const;

    /**
     * @brief add an element
     */
    void append(GeoDataGeometry *other);

    GeoDataMultiGeometry &operator<<(const GeoDataGeometry &value);

    QList<GeoDataGeometry *>::Iterator begin();
    QList<GeoDataGeometry *>::Iterator end();
    QList<GeoDataGeometry *>::ConstIterator constBegin() const;
    QList<GeoDataGeometry *>::ConstIterator constEnd() const;
    void clear();
    QList<GeoDataGeometry *> vector();

    QList<GeoDataGeometry *>::Iterator erase(QList<GeoDataGeometry *>::Iterator pos);
    QList<GeoDataGeometry *>::Iterator erase(QList<GeoDataGeometry *>::Iterator begin, QList<GeoDataGeometry *>::Iterator end);

    // Serialize the Placemark to @p stream
    void pack(QDataStream &stream) const override;
    // Unserialize the Placemark from @p stream
    void unpack(QDataStream &stream) override;

private:
    Q_DECLARE_PRIVATE(GeoDataMultiGeometry)
};

}

#endif