#pragma once

#include <QLocale>
#include <QSet>

#include "aqsi-commons-qt_global.h"

namespace aqsi {
class AQSICOMMONSQT_EXPORT LocaleHelper : public QObject
{
    Q_OBJECT
public:
    /**
     * \brief Возвращает объект LocaleHelper (singleton).
     */
    static LocaleHelper& instance() noexcept;

    /**
     * \brief Базовая локаль приложения, НЕ включающая специфические настройки отображения чисел и валют.
     * Потокобезопасен для чтения после инициализации методом `setup()`.
     * \return Настроенный объект QLocale.
     */
    QLocale baseLocale() const noexcept;

    /**
     * \brief Локаль приложения, включающая специфические настройки отображения чисел.
     * Потокобезопасен для чтения после инициализации методом `setup()`
     * \return Настроенный объект QLocale.
     */
    QLocale configuredLocaleForNumbers() const noexcept;

    /**
     * \brief Локаль приложения, включающая специфические настройки отображения валют.
     * Потокобезопасен для чтения после инициализации методом `setup()`
     * \return Настроенный объект QLocale.
     */
    QLocale configuredLocaleForMoney() const noexcept;

    /**
     * \brief Метод выполняет обработку конфигурационных параметров от которых зависят настройки локали приложения и
     * настраивает базовую локаль и локаль для чисел/валют.
     * При установке неподдерживаемых значений используются значения по умолчанию.
     * \details Не является потокобезопасным
     * Необходимо вызывать при:
     * - обновлении конфигурации, во время "ожидания продажи"
     * - во время загрузки приложения
     */
    void setup() noexcept;

    QLocale::Language defaultLanguage() const noexcept;
    QLocale::Country defaultCountry() const noexcept;

    void setDefaultLanguage(QLocale::Language const default_language) noexcept;
    void setDefaultCountry(QLocale::Country const default_country) noexcept;

    Q_INVOKABLE QString toCurrencyString(double const value);

private:
    LocaleHelper() = default;
    Q_DISABLE_COPY(LocaleHelper);

    QLocale m_base_locale;
    QLocale m_locale_for_numbers;
    QLocale m_locale_for_money;

    QLocale::Country m_default_country{QLocale::Country::Russia};
    QLocale::Language m_default_language{QLocale::Language::Russian};
};
}  // namespace aqsi
