#pragma once

/**
 * \file
 * \brief Реализация сервиса состояния MDB Cashless.
 *
 * Класс StateService реализует интерфейс IStateService и обеспечивает хранение
 * и уведомление о состоянии MDB-сервиса и VMC (торгового автомата):
 * - состояние сервиса и VMC (state),
 * - текущая сессия продажи (vendSession),
 * - настройки расширений (expansionEnableOptions),
 * - результаты продаж (vendResultAdded).
 *
 * Основные функции:
 * - Проверка и изменение активности сервиса (isServiceActive/setServiceActive).
 * - Чтение и установка текущих опций расширений (expansionEnableOptions/setExpansionEnableOptions).
 * - Чтение состояния VMC и текущей сессии (state/vendSession).
 * - Установка нового состояния и контекста сессии (setState/setSessionContext).
 * - Добавление результатов продажи (addVendResult) с уведомлением через сигналы.
 *
 * \note Для передачи структур через DBus необходимо зарегистрировать мета-типы с помощью registerMetaTypes().
 */

#include "IStateService.h"

namespace aqsi {
namespace mdb {
namespace cashless {

class AQSIMDB_EXPORT StateService : public IStateService
{
public:
    using IStateService::IStateService;

    bool isServiceActive() const override;
    void setServiceActive(bool const active) override;

    aqsi::mdb::cashless::ExpansionEnableOptions expansionEnableOptions() const override;
    void setExpansionEnableOptions(aqsi::mdb::cashless::ExpansionEnableOptions const options) override;

    std::optional<aqsi::mdb::cashless::VendSession> vendSession() const override;
    aqsi::mdb::cashless::State state() const override;

    void setState(aqsi::mdb::cashless::State const state) override;
    void setSessionContext(
        aqsi::mdb::cashless::State const state,
        std::optional<aqsi::mdb::cashless::VendSession> const& vend_session) override;

    void addVendResult(aqsi::mdb::cashless::VendResult const& vend_result, uint8_t const remaining_count) override;

protected:
    bool m_service_active{false};
    ExpansionEnableOptions m_options;
    State m_state;
    std::optional<VendSession> m_vend_session;
};

}  // namespace cashless
}  // namespace mdb
}  // namespace aqsi
