<?php
namespace Imi\MQTT\Test;

use Imi\MQTT\Client\Contract\IMQTTClientListener;

class TestClientListener implements IMQTTClientListener
{
    /**
     * @var \BinSoul\Net\Mqtt\Packet\ConnectResponsePacket
     */
    private $connectACKResult;

    /**
     * @var array
     */
    private $publishResults;

    /**
     * @var \BinSoul\Net\Mqtt\Packet\SubscribeResponsePacket
     */
    private $subscribeACKResult;

    /**
     * @var \BinSoul\Net\Mqtt\Packet\UnSubscribeResponsePacket
     */
    private $unsubscribeACKResult;

    /**
     * @var \BinSoul\Net\Mqtt\Packet\PingResponsePacket
     */
    private $pingResult;

    /**
     * 连接确认
     *
     * @param \Imi\MQTT\Client\MQTTClient $client
     * @param \BinSoul\Net\Mqtt\Packet\ConnectResponsePacket $packet
     * @return void
     */
    public function connectACK(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\ConnectResponsePacket $packet)
    {
        $this->connectACKResult = $packet;
    }

    /**
     * 发布
     *
     * @param \Imi\MQTT\Client\MQTTClient $client
     * @param \BinSoul\Net\Mqtt\Packet\PublishRequestPacket $packet
     * @return void
     */
    public function publish(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PublishRequestPacket $packet)
    {
        $this->publishResults[$packet->getPacketType()] = $packet;
    }

    /**
     * 发布确认
     *
     * @param \Imi\MQTT\Client\MQTTClient $client
     * @param \BinSoul\Net\Mqtt\Packet\PublishAckPacket $packet
     * @return void
     */
    public function publishAck(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PublishAckPacket $packet)
    {
        $this->publishResults[$packet->getPacketType()] = $packet;
    }

    /**
     * 发布已收到(保证交付部分1)
     *
     * @param \Imi\MQTT\Client\MQTTClient $client
     * @param \BinSoul\Net\Mqtt\Packet\PublishReceivedPacket $packet
     * @return void
     */
    public function publishReceived(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PublishReceivedPacket $packet)
    {
        $this->publishResults[$packet->getPacketType()] = $packet;
    }

    /**
     * 发布释放(确保交付的第2部分)
     *
     * @param \Imi\MQTT\Client\MQTTClient $client
     * @param \BinSoul\Net\Mqtt\Packet\PublishReleasePacket $packet
     * @return void
     */
    public function publishRelease(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PublishReleasePacket $packet)
    {
        $this->publishResults[$packet->getPacketType()] = $packet;
    }

    /**
     * 发布完成(保证交付的第3部分)
     *
     * @param \Imi\MQTT\Client\MQTTClient $client
     * @param \BinSoul\Net\Mqtt\Packet\PublishCompletePacket $packet
     * @return void
     */
    public function publishComplete(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PublishCompletePacket $packet)
    {
        $this->publishResults[$packet->getPacketType()] = $packet;
    }

    /**
     * 订阅确认
     *
     * @param \Imi\MQTT\Client\MQTTClient $client
     * @param \BinSoul\Net\Mqtt\Packet\SubscribeResponsePacket $packet
     * @return void
     */
    public function subscribeACK(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\SubscribeResponsePacket $packet)
    {
        $this->subscribeACKResult = $packet;
    }

    /**
     * 取消订阅确认
     *
     * @param \Imi\MQTT\Client\MQTTClient $client
     * @param \BinSoul\Net\Mqtt\Packet\UnsubscribeResponsePacket $packet
     * @return void
     */
    public function unsubscribeACK(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\UnsubscribeResponsePacket $packet)
    {
        $this->unsubscribeACKResult = $packet;
        $client->disconnect();
    }

    /**
     * Ping 响应
     *
     * @param \Imi\MQTT\Client\MQTTClient $client
     * @param \BinSoul\Net\Mqtt\Packet\PingResponsePacket $packet
     * @return void
     */
    public function ping(\Imi\MQTT\Client\MQTTClient $client, \BinSoul\Net\Mqtt\Packet\PingResponsePacket $packet)
    {
        $this->pingResult = $packet;
    }

    /**
     * Get the value of connectACKResult
     *
     * @return \BinSoul\Net\Mqtt\Packet\ConnectResponsePacket
     */ 
    public function getConnectACKResult()
    {
        return $this->connectACKResult;
    }

    /**
     * Get the value of subscribeACKResult
     *
     * @return \BinSoul\Net\Mqtt\Packet\SubscribeResponsePacket
     */ 
    public function getSubscribeACKResult()
    {
        return $this->subscribeACKResult;
    }

    /**
     * Get the value of unsubscribeACKResult
     *
     * @return \BinSoul\Net\Mqtt\Packet\UnSubscribeResponsePacket
     */ 
    public function getUnsubscribeACKResult()
    {
        return $this->unsubscribeACKResult;
    }

    /**
     * Get the value of pingResult
     *
     * @return \BinSoul\Net\Mqtt\Packet\PingResponsePacket
     */ 
    public function getPingResult()
    {
        return $this->pingResult;
    }

    /**
     * Get the value of publishResults
     *
     * @return array
     */ 
    public function getPublishResults()
    {
        return $this->publishResults;
    }

}