<?php

namespace Xentral\Components\Filesystem\Adapter;

use Xentral\Components\Filesystem\Exception\InvalidArgumentException;

final class FtpConfig
{
    /** @var string $hostname */
    private $hostname;

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

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

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

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

    /** @var int $timeout */
    private $timeout;

    /** @var bool $passive */
    private $passive;

    /** @var bool $ssl */
    private $ssl;

    /**
     * @param string $hostname
     * @param string $username
     * @param string $password
     * @param string $rootDir
     * @param int    $port
     * @param int    $timeout
     * @param bool   $passive
     * @param bool   $ssl
     */
    public function __construct(
        $hostname,
        $username,
        $password,
        $rootDir = '/',
        $port = 21,
        $timeout = 30,
        $passive = true,
        $ssl = false
    ) {
        if (empty($hostname)) {
            throw new InvalidArgumentException('Hostname is empty.');
        }
        if (empty($username)) {
            throw new InvalidArgumentException('Username is empty.');
        }
        if (empty($password)) {
            throw new InvalidArgumentException('Password is empty.');
        }
        if (empty($rootDir)) {
            throw new InvalidArgumentException('Root dir is empty.');
        }

        $this->hostname = (string)$hostname;
        $this->username = (string)$username;
        $this->password = (string)$password;
        $this->rootDir = (string)$rootDir;
        $this->port = (int)$port;
        $this->timeout = (int)$timeout;
        $this->passive = (bool)$passive;
        $this->ssl = (bool)$ssl;
    }

    /**
     * @return array
     */
    public function toArray()
    {
        return [
            'host'            => $this->hostname,
            'username'        => $this->username,
            'password'        => $this->password,
            'root'            => $this->rootDir,
            'port'            => $this->port,
            'timeout'         => $this->timeout,
            'passive'         => $this->passive,
            'ssl'             => $this->ssl,
            'recurseManually' => true,
        ];
    }

    /**
     * @return string
     */
    public function getHostname()
    {
        return $this->hostname;
    }

    /**
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * @return string
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * @return null
     */
    public function getRootDir()
    {
        return $this->rootDir;
    }

    /**
     * @return int
     */
    public function getPort()
    {
        return $this->port;
    }

    /**
     * @return int
     */
    public function getTimeout()
    {
        return $this->timeout;
    }

    /**
     * @return bool
     */
    public function isPassive()
    {
        return $this->passive;
    }

    /**
     * @return bool
     */
    public function isSsl()
    {
        return $this->ssl;
    }
}