/*
    SPDX-FileCopyrightText: 2020 Kevin Ottens <kevin.ottens@enioka.com>

    SPDX-License-Identifier: GPL-2.0-or-later
*/

#pragma once

#include <KCoreConfigSkeleton>

class XdgPathsSettingsStore;

class DesktopPathsSettings : public KCoreConfigSkeleton
{
    Q_OBJECT

    Q_PROPERTY(QUrl desktopLocation READ desktopLocation WRITE setDesktopLocation NOTIFY desktopLocationChanged)
    Q_PROPERTY(QUrl defaultDesktopLocation READ defaultDesktopLocation CONSTANT)

    Q_PROPERTY(QUrl documentsLocation READ documentsLocation WRITE setDocumentsLocation NOTIFY documentsLocationChanged)
    Q_PROPERTY(QUrl defaultDocumentsLocation READ defaultDocumentsLocation CONSTANT)

    Q_PROPERTY(QUrl downloadsLocation READ downloadsLocation WRITE setDownloadsLocation NOTIFY downloadsLocationChanged)
    Q_PROPERTY(QUrl defaultDownloadsLocation READ defaultDownloadsLocation CONSTANT)

    Q_PROPERTY(QUrl musicLocation READ musicLocation WRITE setMusicLocation NOTIFY musicLocationChanged)
    Q_PROPERTY(QUrl defaultMusicLocation READ defaultMusicLocation CONSTANT)

    Q_PROPERTY(QUrl picturesLocation READ picturesLocation WRITE setPicturesLocation NOTIFY picturesLocationChanged)
    Q_PROPERTY(QUrl defaultPicturesLocation READ defaultPicturesLocation CONSTANT)

    Q_PROPERTY(QUrl videosLocation READ videosLocation WRITE setVideosLocation NOTIFY videosLocationChanged)
    Q_PROPERTY(QUrl defaultVideosLocation READ defaultVideosLocation CONSTANT)

    Q_PROPERTY(QUrl publicLocation READ publicLocation WRITE setPublicLocation NOTIFY publicLocationChanged)
    Q_PROPERTY(QUrl defaultPublicLocation READ defaultPublicLocation CONSTANT)

    Q_PROPERTY(QUrl templatesLocation READ templatesLocation WRITE setTemplatesLocation NOTIFY templatesLocationChanged)
    Q_PROPERTY(QUrl defaultTemplatesLocation READ defaultTemplatesLocation CONSTANT)

    Q_PROPERTY(QUrl projectsLocation READ projectsLocation WRITE setProjectsLocation NOTIFY projectsLocationChanged)
    Q_PROPERTY(QUrl defaultProjectsLocation READ defaultProjectsLocation CONSTANT)

public:
    DesktopPathsSettings(QObject *parent = nullptr);

    QUrl desktopLocation() const;
    void setDesktopLocation(const QUrl &url);
    QUrl defaultDesktopLocation() const;

    QUrl documentsLocation() const;
    void setDocumentsLocation(const QUrl &url);
    QUrl defaultDocumentsLocation() const;

    QUrl downloadsLocation() const;
    void setDownloadsLocation(const QUrl &url);
    QUrl defaultDownloadsLocation() const;

    QUrl musicLocation() const;
    void setMusicLocation(const QUrl &url);
    QUrl defaultMusicLocation() const;

    QUrl picturesLocation() const;
    void setPicturesLocation(const QUrl &url);
    QUrl defaultPicturesLocation() const;

    QUrl videosLocation() const;
    void setVideosLocation(const QUrl &url);
    QUrl defaultVideosLocation() const;

    QUrl publicLocation() const;
    void setPublicLocation(const QUrl &url);
    QUrl defaultPublicLocation() const;

    QUrl templatesLocation() const;
    void setTemplatesLocation(const QUrl &url);
    QUrl defaultTemplatesLocation() const;

    QUrl projectsLocation() const;
    void setProjectsLocation(const QUrl &url);
    QUrl defaultProjectsLocation() const;

Q_SIGNALS:
    void desktopLocationChanged();
    void documentsLocationChanged();
    void downloadsLocationChanged();
    void musicLocationChanged();
    void picturesLocationChanged();
    void videosLocationChanged();
    void publicLocationChanged();
    void templatesLocationChanged();
    void projectsLocationChanged();

private:
    void addItemInternal(const QByteArray &propertyName, const QVariant &defaultValue, const std::function<void()> &signal);

private:
    XdgPathsSettingsStore *const m_xdgPathsStore;
};
