<?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-2010 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_Request_RequestAbstract
 */
require_once 'Zend/Service/DeveloperGarden/Request/RequestAbstract.php';

/**
 * @category   Zend
 * @package    Zend_Service
 * @subpackage DeveloperGarden
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @author     Marco Kaiser
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
abstract class Zend_Service_DeveloperGarden_Request_SendSms_SendSmsAbstract
    extends Zend_Service_DeveloperGarden_Request_RequestAbstract
{
    /**
     * the number or numbers to receive this sms
     *
     * @var string
     */
    public $number = null;

    /**
     * the message of this sms
     *
     * @var string
     */
    public $message = null;

    /**
     * name of the sender
     *
     * @var string
     */
    public $originator = null;

    /**
     * account
     *
     * @var integer
     */
    public $account = null;

    /**
     * array of special chars that are used for counting
     * message length
     *
     * @var array
     */
    private $_specialChars = array(
        '|', 
        '^', 
        '{', 
        '}', 
        '[', 
        ']', 
        '~', 
        '\\', 
        "\n",
        // '€', removed because its counted in utf8 correctly
    );

    /**
     * what SMS type is it
     *
     * 1 = SMS
     * 2 = FlashSMS
     *
     * @var integer
     */
    protected $_smsType = 1;

    /**
     * the counter for increasing message count
     * if more than this 160 chars we send a 2nd or counting
     * sms message
     *
     * @var integer
     */
    protected $_smsLength = 153;

    /**
     * maximum length of an sms message
     *
     * @var integer
     */
    protected $_maxLength = 765;

    /**
     * the maximum numbers to send an sms
     *
     * @var integer
     */
    protected $_maxNumbers = 10;

    /**
     * returns the assigned numbers
     *
     * @return string $number
     */
    public function getNumber()
    {
        return $this->number;
    }

    /**
     * set a new number(s)
     *
     * @param string $number
     * @throws Zend_Service_DeveloperGarden_Request_Exception
     *
     * @return Zend_Service_DeveloperGarden_Request_SendSms_SendSmsAbstract
     */
    public function setNumber($number)
    {
        $this->number = $number;
        if ($this->getNumberCount() > $this->_maxNumbers) {
            require_once 'Zend/Service/DeveloperGarden/Request/Exception.php';
            throw new Zend_Service_DeveloperGarden_Request_Exception('The message is too long.');
        }
        return $this;
    }

    /**
     * returns the current message
     *
     * @return string $message
     */
    public function getMessage()
    {
        return $this->message;
    }

    /**
     * sets a new message
     *
     * @param string $message
     * @throws Zend_Service_DeveloperGarden_Request_Exception
     *
     * @return Zend_Service_DeveloperGarden_Request_SendSms_SendSmsAbstract
     */
    public function setMessage($message)
    {
        $this->message = $message;
        if ($this->getMessageLength() > $this->_maxLength) {
            require_once 'Zend/Service/DeveloperGarden/Request/Exception.php';
            throw new Zend_Service_DeveloperGarden_Request_Exception('The message is too long.');
        }
        return $this;
    }

    /**
     * returns the originator
     *
     * @return the $originator
     */
    public function getOriginator()
    {
        return $this->originator;
    }

    /**
     * the originator name
     *
     * @param string $originator
     * @return Zend_Service_DeveloperGarden_Request_SendSms_SendSmsAbstract
     */
    public function setOriginator($originator)
    {
        $this->originator = $originator;
        return $this;
    }

    /**
     * the account
     * @return integer $account
     */
    public function getAccount()
    {
        return $this->account;
    }

    /**
     * sets a new accounts
     *
     * @param $account the $account to set
     * @return Zend_Service_DeveloperGarden_Request_SendSms_SendSmsAbstract
     */
    public function setAccount($account)
    {
        $this->account = $account;
        return $this;
    }

    /**
     * returns the calculated message length
     *
     * @return integer
     */
    public function getMessageLength()
    {
        $message = $this->getMessage();
        $length  = strlen($message);

        foreach ($this->_specialChars as $char) {
            $c = (substr_count($message, $char) * 2) - 1;
            if ($c > 0) {
                $length += $c;
            }
        }

        return $length;
    }

    /**
     * returns the count of sms messages that would be send
     *
     * @return integer
     */
    public function getMessageCount()
    {
        $smsLength = $this->getMessageLength();
        $retValue = 1;
        if ($smsLength > 160) {
            $retValue = ceil($smsLength / $this->_smsLength);
        }
        return $retValue;
    }

    /**
     * returns the count of numbers in this sms
     *
     * @return integer
     */
    public function getNumberCount()
    {
        $number   = $this->getNumber();
        $retValue = 0;
        if (!empty($number)) {
            $retValue = count(explode(',', $number));
        }
        return $retValue;
    }

    /**
     * returns the sms type
     * currently we have
     * 1 = Sms
     * 2 = FlashSms
     *
     * @return integer
     */
    public function getSmsType()
    {
        return $this->_smsType;
    }
}
