1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 
<?php

namespace SAREhub\Client\Amqp;


class AmqpConnectionOptions
{
    const DEFAULT_CONNECTION_TIMEOUT = 3;
    const DEFAULT_HEARTBEAT = 30;

    /**
     * @var string
     */
    private $host = "";

    /**
     * @var string
     */
    private $vhost = "/";

    /**
     * @var int
     */
    private $port = 5672;

    /**
     * @var string
     */
    private $user;

    /**
     * @var string
     */
    private $password;

    /**
     * @var int
     */
    private $connectionTimeout = self::DEFAULT_CONNECTION_TIMEOUT;

    /**
     * @var int
     */
    private $readWriteTimeout = (self::DEFAULT_HEARTBEAT * 2) + 1;

    /**
     * @var bool
     */
    private $keepalive = true;

    /**
     * @var int
     */
    private $heartbeat = self::DEFAULT_HEARTBEAT;

    /**
     * @var bool
     */
    private $sslEnabled = false;

    /**
     * @var bool
     */
    private $sslVerifyPeer = false;

    /**
     * @var bool
     */
    private $sslVerifyPeerName = false;

    public static function newInstance(): AmqpConnectionOptions
    {
        return new self();
    }

    public function withHost(string $host): AmqpConnectionOptions
    {
        $this->host = $host;
        return $this;
    }

    public function withVhost(string $vhost): AmqpConnectionOptions
    {
        $this->vhost = $vhost;
        return $this;
    }

    public function withPort(int $port): AmqpConnectionOptions
    {
        $this->port = $port;
        return $this;
    }

    public function withUser(string $user): AmqpConnectionOptions
    {
        $this->user = $user;
        return $this;
    }

    public function withPassword(string $password): AmqpConnectionOptions
    {
        $this->password = $password;
        return $this;
    }

    public function withConnectionTimeout(int $connectionTimeout): AmqpConnectionOptions
    {
        $this->connectionTimeout = $connectionTimeout;
        return $this;
    }

    public function withReadWriteTimeout(int $readWriteTimeout): AmqpConnectionOptions
    {
        $this->readWriteTimeout = $readWriteTimeout;
        return $this;
    }

    public function withKeepalive(bool $keepalive = true): AmqpConnectionOptions
    {
        $this->keepalive = $keepalive;
        return $this;
    }

    public function withHeartbeat(int $heartbeat): AmqpConnectionOptions
    {
        $this->heartbeat = $heartbeat;
        return $this;
    }

    public function withSsl(bool $enabled = true): AmqpConnectionOptions
    {
        $this->sslEnabled = $enabled;
        return $this;
    }

    public function withSslVerifyPeer(bool $sslVerifyPeer): AmqpConnectionOptions
    {
        $this->sslVerifyPeer = $sslVerifyPeer;
        return $this;
    }


    public function withSslVerifyPeerName(bool $sslVerifyPeerName): AmqpConnectionOptions
    {
        $this->sslVerifyPeerName = $sslVerifyPeerName;
        return $this;
    }

    public function getHost(): string
    {
        return $this->host;
    }

    public function getVhost(): string
    {
        return $this->vhost;
    }

    public function getPort(): int
    {
        return $this->port;
    }

    public function getUser(): string
    {
        return $this->user;
    }

    public function getPassword(): string
    {
        return $this->password;
    }

    public function getConnectionTimeout(): int
    {
        return $this->connectionTimeout;
    }

    public function getReadWriteTimeout(): int
    {
        return $this->readWriteTimeout;
    }

    public function isKeepalive(): bool
    {
        return $this->keepalive;
    }

    public function getHeartbeat(): int
    {
        return $this->heartbeat;
    }

    public function isSslEnabled(): bool
    {
        return $this->sslEnabled;
    }

    public function isSslVerifyPeer(): bool
    {
        return $this->sslVerifyPeer;
    }

    public function isSslVerifyPeerName(): bool
    {
        return $this->sslVerifyPeerName;
    }
}