<?php

/**
 * Goweb Sitemanager 5 Framework
 *
 * @version    5.0.0
 * @category   Goweb
 * @package    Goweb_Mail_Sms
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
 */

/**
 *
 * @version    5.0.0
 * @category   Goweb
 * @package    Goweb_Mail_Sms
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
 */

/**
 * Goweb_Config
*/
Goweb::loadClass('Goweb_Config');

/**
 * Goweb_Config_Ini
*/
Goweb::loadClass('Goweb_Config_Ini');

/**
 * Goweb_Exception
*/
Goweb::loadClass('Goweb_Exception');

/**
 * Goweb_Mail_Sms
*/
class Goweb_Mail_Sms {
    
    /**
     * Ficheiro de Configuracao na memoria
     *
     * @var Goweb_Config_Ini
    */
    protected $_config = null;
    
    /**
     * Email destino da mensagem que ira tratar de reencaminhar as mensagens
     *
     * @var string
    */
    protected $_email = null;
    
    /**
     * Identificador da API de envio de SMS no servidor
     *
     * @var string
    */
    protected $_apiId = null;
    
    /**
     * Utilizador do servidor de envio de SMS no servidor
     *
     * @var string
    */
    protected $_user = null;
    /**
     * Password do servidor de envio de SMS no servidor
     *
     * @var string
    */
    protected $_password = null;
    
    /**
     * Numeros de telemoveis para os quais a mensagem sera encaminhada
     *
     * @var array
    */
    protected $_to = array();
    
    /**
     * Mensagem a ser enviada. Cada posicao do array so pode conter 40 caracteres
     *
     * @var array
    */
    protected $_message = array();
    
    /**
     * Corpo da mensagem. De acordo com as especificacoes.
     *
     * <code>
     * api_id:422578
     * user:goweb
     * password:xptoxxx
     * to:+351962036671
     * to:+351962036672
     * to:+351962036611
     * text:Hoje na radio oferta de bilhetes
     * text: para o filme
     * </code>
     *
     * @var string
    */
    protected $_body = null;
    
    /**
     * Inicializa variaveis e constroi o corpo da mensagem
     *
     * @param array
     * @param string
     * @param string
     *
    */
    public function __construct ($to, $message, $prefix = '+351') {
        $this->_config = new Goweb_Config(Goweb_Config_Ini::load(ROOT_PATH . DIRECTORY_SEPARATOR . 'config.ini', 'production'));
        
        $this->_email = $this->_config->sms->email;
        $this->_apiId = $this->_config->sms->api_id;
        $this->_user = $this->_config->sms->user;
        $this->_password = $this->_config->sms->password;
        
        $this->_buildTo($to, $prefix);
        $this->_buildMessage($message);
        
        $this->_render();
    }
    
    /**
     * Este metodo utiliza a classe Goweb_Mail para enviar os sms's
     *
     * @return boolean
    */
    public function sendSms() {
        Goweb::loadClass('Goweb_Mail');
                
        $mail = new Goweb_Mail();
        
        $mail->setSubject('SMS - Goweb');
        
        // email que recebe as mensagens sms
        $mail->addTo($this->_email);
        
        // corpo da mensagem
        $mail->setBodyText($this->_body);
        
        if ($mail->send()) {
            return true;
        } else {
            return false;
        }
    }
    
    /**
     * Este metodo eh um wraper do metodo sendSms
     *
     * @return boolean
    */
    public function send() {
        return $this->sendSms();
    }
    
    /**
     * Preenche o array de numeros de destino
     *
     * @param array
     * @param string
    */
    protected function _buildTo($to, $prefix) {
        if (is_array($to)) {
            foreach ($to as $number) {
                $this->_to[] = "to:" . $prefix . trim($number) . "\n";
            }
        } else {
            $this->_to[] = "to:" . $prefix . trim($to) . "\n";
        }
    }
    
    /**
     * Metodo que trata a mensagem a ser enviada.
     * A mensagem nao pode conter caracteres especiais!
    */
    protected function _buildMessage($message) {
        $this->_message[] = "text:" . $this->_clearString($message) . "\n";
    }
    
    /**
     * Metodo para montar o corpo da mensagem SMS
    */
    protected function _render() {
        $this->_body = '';
        
        // autenticacao
        $this->_body .= "api_id:" . $this->_apiId . "\n";
        $this->_body .= "user:" . $this->_user . "\n";
        $this->_body .= "password:" . $this->_password . "\n";
        
        // destinatarios
        foreach ($this->_to as $number) {
            $this->_body .= $number;
        }
        
        // mensagem
        foreach ($this->_message as $piece) {
            $this->_body .= $piece;
        }
        
    }
    
    /**
     * Metodo de ajuda para limpar a string, passada por parametro, e substituir
     * os caracteres invalidos por seus equivalentes validos.
     *
     * @param string
     *
     * @return string
    */
    protected function _clearString($str) {
        $alterList = array('/e/' => 'a', '/e/' => 'a', '/e/' => 'a', '/e/' => 'e',
                           '/e/' => 'i', '/e/' => 'o', '/e/' => 'o', '/e/' => 'u',
                           '/e/' => 'u', '/e/' => 'c', '/e/' => 'A', '/e/' => 'A',
                           '/e/' => 'A', '/e/' => 'E', '/e/' => 'I', '/e/' => 'e',
                           '/e/' => 'E', '/e/' => 'a', '/e/' => 'A', '/e/' => 'O',
                           '/e/' => 'o', '/e/' => 'O', '/e/' => 'O', '/e/' => 'U',
                           '/e/' => 'U', '/e/' => 'C', '/?/' => 'e');
        
        //$formatted = preg_replace(array_keys($alterList), array_values($alterList), $str);
        //$formatted = trim($formatted); // limpa espacos antes e depois da string
        
        $formatted = trim($str); // limpa espacos antes e depois da string
        
        return $formatted;
    }
    
}
?>