<?php
/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Service
 * @subpackage DeveloperGarden
 * @copyright  Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id$
 */

/**
 * @see Zend_Service_DeveloperGarden_Client_ClientAbstract
 */
require_once 'Zend/Service/DeveloperGarden/Client/ClientAbstract.php';

/**
 * @see Zend_Service_DeveloperGarden_Response_BaseUserService_GetQuotaInformationResponse
 */
require_once 'Zend/Service/DeveloperGarden/Response/BaseUserService/GetQuotaInformationResponse.php';

/**
 * @see Zend_Service_DeveloperGarden_Response_BaseUserService_ChangeQuotaPoolResponse
 */
require_once 'Zend/Service/DeveloperGarden/Response/BaseUserService/ChangeQuotaPoolResponse.php';

/**
 * @see Zend_Service_DeveloperGarden_Response_BaseUserService_GetAccountBalanceResponse
 */
require_once 'Zend/Service/DeveloperGarden/Response/BaseUserService/GetAccountBalanceResponse.php';

/**
 * @see Zend_Service_DeveloperGarden_BaseUserService_AccountBalance
 */
require_once 'Zend/Service/DeveloperGarden/BaseUserService/AccountBalance.php';

/**
 * @see Zend_Service_DeveloperGarden_Request_BaseUserService_GetQuotaInformation
 */
require_once 'Zend/Service/DeveloperGarden/Request/BaseUserService/GetQuotaInformation.php';

/**
 * @see Zend_Service_DeveloperGarden_Request_BaseUserService_ChangeQuotaPool
 */
require_once 'Zend/Service/DeveloperGarden/Request/BaseUserService/ChangeQuotaPool.php';

/**
 * @see Zend_Service_DeveloperGarden_Request_BaseUserService_GetAccountBalance
 */
require_once 'Zend/Service/DeveloperGarden/Request/BaseUserService/GetAccountBalance.php';

/**
 * @category   Zend
 * @package    Zend_Service
 * @subpackage DeveloperGarden
 * @copyright  Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
 * @author     Marco Kaiser
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class Zend_Service_DeveloperGarden_BaseUserService extends Zend_Service_DeveloperGarden_Client_ClientAbstract
{
    /**
     * wsdl file
     *
     * @var string
     */
    protected $_wsdlFile = 'https://gateway.developer.telekom.com/p3gw-mod-odg-admin/services/ODGBaseUserService?wsdl';

    /**
     * wsdl file local
     *
     * @var string
     */
    protected $_wsdlFileLocal = 'Wsdl/ODGBaseUserService.wsdl';

    /**
     * Response, Request Classmapping
     *
     * @var array
     *
     */
    protected $_classMap = array(
        'getQuotaInformationResponse' =>
            'Zend_Service_DeveloperGarden_Response_BaseUserService_GetQuotaInformationResponse',
        'changeQuotaPoolResponse' =>
            'Zend_Service_DeveloperGarden_Response_BaseUserService_ChangeQuotaPoolResponse',
        'getAccountBalanceResponse' =>
            'Zend_Service_DeveloperGarden_Response_BaseUserService_GetAccountBalanceResponse',
        'AccountBalance' =>
            'Zend_Service_DeveloperGarden_BaseUserService_AccountBalance',
    );

    /**
     * array with all QuotaModuleIds
     *
     * @var array
     */
    protected $_moduleIds = array(
        'SmsProduction'            => 'SmsProduction',
        'SmsSandbox'               => 'SmsSandbox',
        'VoiceCallProduction'      => 'VoiceButlerProduction',
        'VoiceCallSandbox'         => 'VoiceButlerSandbox',
        'ConferenceCallProduction' => 'CCSProduction',
        'ConferenceCallSandbox'    => 'CCSSandbox',
        'LocalSearchProduction'    => 'localsearchProduction',
        'LocalSearchSandbox'       => 'localsearchSandbox',
        'IPLocationProduction'     => 'IPLocationProduction',
        'IPLocationSandbox'        => 'IPLocationSandbox'
    );

    /**
     * returns an array with all possible ModuleIDs
     *
     * @return array
     */
    public function getModuleIds()
    {
        return $this->_moduleIds;
    }

    /**
     * checks the moduleId and throws exception if not valid
     *
     * @param string $moduleId
     * @throws Zend_Service_DeveloperGarden_Client_Exception
     * @return void
     */
    protected function _checkModuleId($moduleId)
    {
        if (!in_array($moduleId, $this->_moduleIds)) {
            require_once 'Zend/Service/DeveloperGarden/Client/Exception.php';
            throw new Zend_Service_DeveloperGarden_Client_Exception('moduleId not valid');
        }
    }

    /**
     * returns the correct module string
     *
     * @param string $module
     * @param integer $environment
     * @return string
     */
    protected function _buildModuleString($module, $environment)
    {
        $moduleString = $module;
        switch($environment) {
            case self::ENV_PRODUCTION :
                $moduleString .= 'Production';
                break;
            case self::ENV_SANDBOX :
                $moduleString .= 'Sandbox';
                break;
            default:
                require_once 'Zend/Service/DeveloperGarden/Client/Exception.php';
                throw new Zend_Service_DeveloperGarden_Client_Exception(
                    'Not a valid environment supplied.'
                );
        }

        if (!in_array($moduleString, $this->_moduleIds)) {
            require_once 'Zend/Service/DeveloperGarden/Client/Exception.php';
            throw new Zend_Service_DeveloperGarden_Client_Exception(
                'Not a valid module name supplied.'
            );
        }

        return $moduleString;
    }

    /**
     * returns the request object with the specific moduleId
     *
     * @param string $moduleId
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_GetQuotaInformationResponse
     */
    protected function _getRequestModule($moduleId)
    {
        return new Zend_Service_DeveloperGarden_Request_BaseUserService_GetQuotaInformation(
            $moduleId
        );
    }

    /**
     * returns the request object with the specific moduleId and new quotaMax value
     *
     * @param string $moduleId
     * @param integer $quotaMax
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_GetQuotaInformationResponse
     */
    protected function _getChangeRequestModule($moduleId, $quotaMax)
    {
        return new Zend_Service_DeveloperGarden_Request_BaseUserService_ChangeQuotaPool(
            $moduleId,
            $quotaMax
        );
    }

    /**
     * returns the Quota Information for SMS Service
     *
     * @param int $environment
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_GetQuotaInformationResponse
     */
    public function getSmsQuotaInformation($environment = self::ENV_PRODUCTION)
    {
        self::checkEnvironment($environment);
        $moduleId = $this->_buildModuleString('Sms', $environment);
        $request  = $this->_getRequestModule($moduleId);
        return $this->getQuotaInformation($request);
    }

    /**
     * returns the Quota Information for VoiceCall Service
     *
     * @param int $environment
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_GetQuotaInformationResponse
     */
    public function getVoiceCallQuotaInformation($environment = self::ENV_PRODUCTION)
    {
        self::checkEnvironment($environment);
        $moduleId = $this->_buildModuleString('VoiceButler', $environment);
        $request  = $this->_getRequestModule($moduleId);
        return $this->getQuotaInformation($request);
    }

    /**
     * returns the Quota Information for SMS ConferenceCall
     *
     * @param int $environment
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_GetQuotaInformationResponse
     */
    public function getConfernceCallQuotaInformation($environment = self::ENV_PRODUCTION)
    {
        self::checkEnvironment($environment);
        $moduleId = $this->_buildModuleString('CCS', $environment);
        $request  = $this->_getRequestModule($moduleId);
        return $this->getQuotaInformation($request);
    }

    /**
     * returns the Quota Information for LocaleSearch Service
     *
     * @param int $environment
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_GetQuotaInformationResponse
     */
    public function getLocalSearchQuotaInformation($environment = self::ENV_PRODUCTION)
    {
        self::checkEnvironment($environment);
        $moduleId = $this->_buildModuleString('localsearch', $environment);
        $request  = $this->_getRequestModule($moduleId);
        return $this->getQuotaInformation($request);
    }

    /**
     * returns the Quota Information for IPLocation Service
     *
     * @param int $environment
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_GetQuotaInformationResponse
     */
    public function getIPLocationQuotaInformation($environment = self::ENV_PRODUCTION)
    {
        self::checkEnvironment($environment);
        $moduleId = $this->_buildModuleString('IPLocation', $environment);
        $request  = $this->_getRequestModule($moduleId);
        return $this->getQuotaInformation($request);
    }

    /**
     * returns the quota information
     *
     * @param Zend_Service_DeveloperGarden_Request_BaseUserService $request
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_GetQuotaInformationResponse
     */
    public function getQuotaInformation(
        Zend_Service_DeveloperGarden_Request_BaseUserService_GetQuotaInformation $request
    ) {
        $this->_checkModuleId($request->getModuleId());
        return $this->getSoapClient()
                    ->getQuotaInformation($request)
                    ->parse();
    }

    /**
     * sets new user quota for the sms service
     *
     * @param integer $quotaMax
     * @param integer $environment
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_ChangeQuotaPoolResponse
     */
    public function changeSmsQuotaPool($quotaMax = 0, $environment = self::ENV_PRODUCTION)
    {
        self::checkEnvironment($environment);
        $moduleId = $this->_buildModuleString('Sms', $environment);
        $request  = $this->_getChangeRequestModule($moduleId, $quotaMax);
        return $this->changeQuotaPool($request);
    }

    /**
     * sets new user quota for the voice call service
     *
     * @param integer $quotaMax
     * @param integer $environment
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_ChangeQuotaPoolResponse
     */
    public function changeVoiceCallQuotaPool($quotaMax = 0, $environment = self::ENV_PRODUCTION)
    {
        self::checkEnvironment($environment);
        $moduleId = $this->_buildModuleString('VoiceButler', $environment);
        $request  = $this->_getChangeRequestModule($moduleId, $quotaMax);
        return $this->changeQuotaPool($request);
    }

    /**
     * sets new user quota for the IPLocation service
     *
     * @param integer $quotaMax
     * @param integer $environment
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_ChangeQuotaPoolResponse
     */
    public function changeIPLocationQuotaPool($quotaMax = 0, $environment = self::ENV_PRODUCTION)
    {
        self::checkEnvironment($environment);
        $moduleId = $this->_buildModuleString('IPLocation', $environment);
        $request  = $this->_getChangeRequestModule($moduleId, $quotaMax);
        return $this->changeQuotaPool($request);
    }

    /**
     * sets new user quota for the Conference Call service
     *
     * @param integer $quotaMax
     * @param integer $environment
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_ChangeQuotaPoolResponse
     */
    public function changeConferenceCallQuotaPool($quotaMax = 0, $environment = self::ENV_PRODUCTION)
    {
        self::checkEnvironment($environment);
        $moduleId = $this->_buildModuleString('CCS', $environment);
        $request  = $this->_getChangeRequestModule($moduleId, $quotaMax);
        return $this->changeQuotaPool($request);
    }

    /**
     * sets new user quota for the Local Search service
     *
     * @param integer $quotaMax
     * @param integer $environment
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_ChangeQuotaPoolResponse
     */
    public function changeLocalSearchQuotaPool($quotaMax = 0, $environment = self::ENV_PRODUCTION)
    {
        self::checkEnvironment($environment);
        $moduleId = $this->_buildModuleString('localsearch', $environment);
        $request  = $this->_getChangeRequestModule($moduleId, $quotaMax);
        return $this->changeQuotaPool($request);
    }

    /**
     * set new quota values for the defined module
     *
     * @param Zend_Service_DeveloperGarden_Request_BaseUserService_ChangeQuotaPool $request
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_ChangeQuotaPoolResponse
     */
    public function changeQuotaPool(
        Zend_Service_DeveloperGarden_Request_BaseUserService_ChangeQuotaPool $request
    ) {
        $this->_checkModuleId($request->getModuleId());
        return $this->getSoapClient()
                    ->changeQuotaPool($request)
                    ->parse();
    }

    /**
     * get the result for a list of accounts
     *
     * @param array $accounts
     * @return Zend_Service_DeveloperGarden_Response_BaseUserService_GetAccountBalanceResponse
     */
    public function getAccountBalance(array $accounts = array())
    {
        $request = new Zend_Service_DeveloperGarden_Request_BaseUserService_GetAccountBalance(
            $accounts
        );
        return $this->getSoapClient()
                    ->getAccountBalance($request)
                    ->parse();
    }
}
