#pragma once

/**
 * \file
 * \brief Интерфейсы входящих и исходящих событий подсистемы MDB Cashless.
 *
 * Файл содержит:
 * - ICashlessIn  — интерфейс входящих событий (VMC → система),
 * - ICashlessOut — интерфейс исходящих сигналов (система → VMC).
 *
 * Интерфейсы разделяют:
 * - обработку протокольных событий MDB,
 * - логику управления состоянием,
 * - транспортный уровень (DBus, serial, mock и т.п.).
 *
 * Типы, используемые в интерфейсах, определены в types.h.
 */

#include <QObject>

#include "types.h"

namespace aqsi {
namespace mdb {
namespace cashless {

/**
 * \brief Интерфейс входящих событий MDB Cashless.
 *
 * Определяет контракт обработки событий,
 * поступающих от VMC (Vending Machine Controller).
 *
 * Реализация интерфейса должна:
 * - обновлять состояние устройства,
 * - управлять жизненным циклом VendSession,
 * - фиксировать результаты выдачи товаров.
 *
 * Интерфейс является транспортно-независимым.
 * Конкретная реализация может быть адаптером для:
 * - DBus,
 * - последовательного порта,
 * - тестового окружения.
 */
class AQSIMDB_EXPORT ICashlessIn
{
public:
    virtual void setExpansionEnableOptions(ExpansionEnableOptions const options) = 0;

    virtual void vmcInactive() = 0;
    virtual void vmcActive()   = 0;

    virtual void reset()                                                                                     = 0;
    virtual void setup()                                                                                     = 0;
    virtual void inactive()                                                                                  = 0;
    virtual void readerDisable()                                                                             = 0;
    virtual void readerEnable()                                                                              = 0;
    virtual void readerCancel()                                                                              = 0;
    virtual void sessionIdle()                                                                               = 0;
    virtual void sessionCancel()                                                                             = 0;
    virtual void sessionComplete()                                                                           = 0;
    virtual void vendRequest(aqsi::mdb::cashless::VendRequest const& request)                                = 0;
    virtual void vendCancel()                                                                                = 0;
    virtual void vendInProgress()                                                                            = 0;
    virtual void vendSuccess(aqsi::mdb::cashless::VendSuccess const& success, uint8_t const remaining_count) = 0;
    virtual void vendFailure(aqsi::mdb::cashless::VendFailure const& failure, uint8_t const remaining_count) = 0;
};

/**
 * \brief Интерфейс исходящих событий устройства безналичной оплаты.
 *
 * Реализуется через Qt-сигналы.
 *
 * Используется для отправки событий
 * от устройства безналичной оплаты к VMC.
 */
class AQSIMDB_EXPORT ICashlessOut : public QObject
{
    Q_OBJECT
public:
    using QObject::QObject;

signals:
    void justReset();
    void beginSession(int funds, unsigned int payment_media_id, int payment_type, int payment_data);
    void sessionCancelRequest();
    void vendApproved(uint32_t const amount);
    void vendDenied();
};
}  // namespace cashless
}  // namespace mdb
}  // namespace aqsi
