// SPDX-License-Identifier: LGPL-2.1-or-later
//
// SPDX-FileCopyrightText: 2011 Dennis Nienhüser <nienhueser@kde.org>
//

#ifndef MARBLE_OSMPLACEMARK_H
#define MARBLE_OSMPLACEMARK_H

#include <QString>

namespace Marble
{

class DatabaseQuery;

/**
 * A lightweight data structure to represent points of interest
 * like addresses with support for serialization.
 */
class OsmPlacemark
{
public:
    enum OsmCategory {
        UnknownCategory,
        AccomodationCamping,
        AccomodationHostel,
        AccomodationHotel,
        AccomodationMotel,
        AccomodationYouthHostel,
        Address,
        AmenityLibrary,
        EducationCollege,
        EducationSchool,
        EducationUniversity,
        FoodBar,
        FoodBiergarten,
        FoodCafe,
        FoodFastFood,
        FoodPub,
        FoodRestaurant,
        HealthDoctors,
        HealthHospital,
        HealthPharmacy,
        MoneyAtm,
        MoneyBank,
        ShoppingBeverages,
        ShoppingHifi,
        ShoppingSupermarket,
        TouristAttraction,
        TouristCastle,
        TouristCinema,
        TouristMonument,
        TouristMuseum,
        TouristRuin,
        TouristTheatre,
        TouristThemePark,
        TouristViewPoint,
        TouristZoo,
        TransportAirport,
        TransportAirportTerminal,
        TransportAirportGate,
        TransportAirportRunway,
        TransportAirportApron,
        TransportAirportTaxiway,
        TransportBusStation,
        TransportBusStop,
        TransportCarShare,
        TransportFuel,
        TransportParking,
        TransportRentalBicycle,
        TransportRentalCar,
        TransportSpeedCamera,
        TransportTaxiRank,
        TransportTrainStation,
        TransportTramStop,
        PlacesRegion,
        PlacesCounty,
        PlacesCity,
        PlacesTown,
        PlacesVillage,
        PlacesHamlet,
        PlacesIsolatedDwelling,
        PlacesSuburb,
        PlacesLocality,
        PlacesIsland,
        HistoricMemorial
    };

    OsmPlacemark();

    OsmCategory category() const;

    void setCategory(OsmCategory category);

    /** Placemark name */
    QString name() const;

    void setName(const QString &name);

    /** Placemark's house number, if any */
    QString houseNumber() const;

    void setHouseNumber(const QString &houseNumber);

    /** Identifier of the smallest region containing this placemark,
        0 if none (~main area). */
    int regionId() const;

    void setRegionId(int id);

    /** Regions' name */
    QString additionalInformation() const;

    void setAdditionalInformation(const QString &name);

    /** Longitude of the placemark's center point, in degree */
    qreal longitude() const;

    void setLongitude(qreal longitude);

    /** Latitude of the placemark's center point, in degree */
    qreal latitude() const;

    void setLatitude(qreal latitude);

    /** Placemarks are sorted by name by default */
    bool operator<(const OsmPlacemark &other) const;

    bool operator==(const OsmPlacemark &other) const;

    qreal matchScore(const DatabaseQuery *query) const;

private:
    int m_regionId;

    OsmCategory m_category;

    QString m_name;

    QString m_houseNumber;

    QString m_additionalInformation;

    qreal m_longitude;

    qreal m_latitude;
};

}

#endif // MARBLE_OSMPLACEMARK_H
