<?php

/**
 * Lifestyle Webconsulting GmbH
 *
 * LICENSE: This Software is the property of Lifestyle Webconsulting GmbH (Aschaffenburg, Germany)
 * and is private by copyright law - it is NOT Freeware.
 *
 * Any unauthorized use of this software without a valid license
 * is a violation of the license agreement and will be prosecuted by
 * civil and criminal law.
 *
 * @copyright  2017 Lifestyle Webconsulting GmbH
 * @link       http://www.life-style.de
 */

namespace Sso\WebserviceBundle\Tests\Functional\Services\Helper\Version1\User;

use Symfony\Bundle\FrameworkBundle\Client;
use Sso\WebserviceBundle\Tests\Functional\Services\Helper\Credentials;
use Sso\WebserviceBundle\Tests\Functional\Services\Helper\Configuration;
use Sso\WebserviceBundle\Tests\Functional\Services\Helper\Version1\Model\User;

/**
 * Class Show
 *
 * @copyright  2017 Lifestyle Webconsulting GmbH
 * @link       http://www.life-style.de
 * @package Version1\User
 */
class Show
{
    /**
     * @var Configuration
     */
    private $configuration;

    /**
     * @var Client
     */
    private $client;

    /**
     * @var array
     */
    private $userAttributes = [
        'Guid',
        'Username',
        'Email',
        'Firstname',
        'Lastname',
        'Active',
        'ActivateToken',
        'ActivateTokenExpire',
        'Deleted',
        'LastLoginAt',
        'LoginFails',
        'AuthId',
        'LdapSearchAttributes',
        'LdapSearchValue'
    ];

    /**
     * Show constructor.
     * @param Configuration $configuration
     * @param Client $client
     */
    public function __construct(Configuration $configuration, Client $client)
    {
        $this->configuration = $configuration;
        $this->client = $client;
    }

    /**
     * @param User $user
     * @return User
     */
    public function execute(User $user)
    {
        $this->client->request(
            'POST',
            $this->configuration->getUrlUserWs(),
            [],
            [],
            [
                'HTTP_API-CONTROLLER' => 'User',
                'HTTP_API-ACTION' => 'Show',
                'CONTENT-TYPE' => 'text/xml; charset=UTF-8',
                'HTTP_API-VERSION' => '1',
                'HTTP_REMOTE_ADDR' => '127.0.0.1',
            ],
            $this->getRequest($user)
        );

        $xml = $this->client->getResponse()->getContent();
        $xmlSimple = simplexml_load_string($xml);

        $user = clone $user;
        if (!isset($xmlSimple->User->Show->UserType)) {
            return $user;
        }
        $userType = $xmlSimple->User->Show->UserType;
        foreach ($this->userAttributes as $attribute) {
            $method = 'set' . $attribute;
            if (isset($userType->$attribute) && method_exists($user, $method)) {
                $user->$method((string)$userType->$attribute);
            }
        }

        return $user;
    }

    /**
     * @param User $user
     * @return string
     */
    private function getRequest(User $user)
    {
        return '<?xml version="1.0" encoding="UTF-8"?>
<SsoRequest>' . (string)(new Credentials($this->configuration)) . '<User>
        <Show>
            <Key>
                <UserType>
                    <Username>' . $this->cdata($user->getUsername()) . '</Username>
                </UserType>
            </Key>
        </Show>
    </User>
</SsoRequest>';
    }

    /**
     * @param string $value
     * @return string
     */
    protected function cdata($value)
    {
        return '<![CDATA[' . $value . ']]>';
    }
}
