/*
    SPDX-FileCopyrightText: 2014-2019 Harald Sitter <sitter@kde.org>

    SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/

#ifndef KOSRELEASE_H
#define KOSRELEASE_H

#include <kcoreaddons_export.h>

#include <QString>
#include <QStringList>

#include <memory>

/**
 * @brief The OSRelease class parses /etc/os-release files
 *
 * https://www.freedesktop.org/software/systemd/man/os-release.html
 *
 * os-release is a free desktop standard for describing an operating system.
 * This class parses and models os-release files.
 *
 * @since 5.58.0
 */
class KCOREADDONS_EXPORT KOSRelease final
{
public:
    /**
     * Constructs a new OSRelease instance. Parsing happens in the constructor
     * and the data is not cached across instances.
     *
     * @note The format specification makes no assertions about trailing #
     *   comments being supported. They result in undefined behavior.
     *
     * @param filePath The path to the os-release file. By default the first
     *   available file of the paths specified in the os-release manpage is
     *   parsed.
     */
    explicit KOSRelease(const QString &filePath = QString());
    ~KOSRelease();

    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#NAME= */
    QString name() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#VERSION= */
    QString version() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#ID= */
    QString id() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#ID_LIKE= */
    QStringList idLike() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#VERSION_CODENAME= */
    QString versionCodename() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#VERSION_ID= */
    QString versionId() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#PRETTY_NAME= */
    QString prettyName() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#ANSI_COLOR= */
    QString ansiColor() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#CPE_NAME= */
    QString cpeName() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#HOME_URL= */
    QString homeUrl() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#HOME_URL= */
    QString documentationUrl() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#HOME_URL= */
    QString supportUrl() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#HOME_URL= */
    QString bugReportUrl() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#HOME_URL= */
    QString privacyPolicyUrl() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#BUILD_ID= */
    QString buildId() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#VARIANT= */
    QString variant() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#VARIANT_ID= */
    QString variantId() const;
    /** @see https://www.freedesktop.org/software/systemd/man/os-release.html#LOGO= */
    QString logo() const;

    /**
     * Extra keys are keys that are unknown or specified by a vendor.
     */
    QStringList extraKeys() const;

    /** Extra values are values assoicated with keys that are unknown. */
    QString extraValue(const QString &key) const;

private:
    Q_DISABLE_COPY(KOSRelease)

    std::unique_ptr<class KOSReleasePrivate> const d;
};

#endif // KOSRELEASE_H