setName('toggle-user')
            ->setAliases(['disableuser', 'enableuser', 'toggleuser', 'change-user-state'])
            ->addOption(
                'user',
                'u',
                InputOption::VALUE_REQUIRED,
                'The username'
            )
            ->addOption(
                'state',
                's',
                InputOption::VALUE_REQUIRED,
                'The state of the account. Can be either `enabled` or `disabled`. [default: "enabled"]'
            )
            ->setDescription('Changes whether user can login or not')
            ->setHelp('The toggle-user sets a user\'s login status to enabled or disabled.')
        ;
    }
    /**
     * @return int|null|void
     */
    protected function serve()
    {
        include __DIR__ . '/../vendor/autoload.php';
        $grav = Grav::instance();
        if (!isset($grav['login'])) {
            $grav['login'] = new Login($grav);
        }
        $this->login = $grav['login'];
        $this->options = [
            'user'        => $this->input->getOption('user'),
            'state'       => $this->input->getOption('state')
        ];
        $this->validateOptions();
        $helper = $this->getHelper('question');
        $data   = [];
        $this->output->writeln('Setting User State');
        $this->output->writeln('');
        /** @var UserCollectionInterface $users */
        $users = $grav['accounts'];
        if (!$this->options['user']) {
            // Get username and validate
            $question = new Question('Enter a username: ');
            $question->setValidator(function ($value) use ($users) {
                $this->validate('user', $value);
                if (!$users->find($value, ['username'])->exists()) {
                    throw new \RuntimeException('Username "' . $value . '" does not exist, please pick another username');
                };
                return $value;
            });
            $username = $helper->ask($this->input, $this->output, $question);
        } else {
            $username = $this->options['user'];
        }
        if (!$this->options['state'] && !\count(array_filter($this->options))) {
            // Choose State
            $question = new ChoiceQuestion(
                'Please choose the state for the account:',
                array('enabled' => 'Enabled', 'disabled' => 'Disabled'),
                'enabled'
            );
            $question->setErrorMessage('State %s is invalid.');
            $data['state'] = $helper->ask($this->input, $this->output, $question);
        } else {
            $data['state'] = $this->options['state'] ?: 'enabled';
        }
        $user = $users->load($username);
        if (!$user->exists()) {
            $this->output->writeln('Failure! User ' . $username . ' does not exist!');
            exit();
        }
        //Set the state field to new state
        $user->set('state', $data['state']);
        $user->save();
        $this->invalidateCache();
        $this->output->writeln('');
        $this->output->writeln('Success! User ' . $username . ' state set to .' . $data['state']);
    }
    /**
     *
     */
    protected function validateOptions()
    {
        foreach (array_filter($this->options) as $type => $value) {
            $this->validate($type, $value);
        }
    }
    /**
     * @param string $type
     * @param mixed  $value
     * @param string $extra
     *
     * @return string
     */
    protected function validate($type, $value)
    {
        return $this->login->validateField($type, $value);
    }
}