<?php

/*
 * PHP server library for KalSMS
 *
 * For example usage see example/www/index.php
 */

class KalSMS
{
    const ACTION_INCOMING = 'incoming';
    const ACTION_OUTGOING = 'outgoing';
    const ACTION_SEND_STATUS = 'send_status';

    const STATUS_QUEUED = 'queued';
    const STATUS_FAILED = 'failed';
    const STATUS_SENT = 'sent';
    
    static function new_from_request()
    {
        $version = @$_SERVER['HTTP_X_KALSMS_VERSION'];        
    
        return new KalSMS();
    }    
    
    static function escape($val)
    {
        return htmlspecialchars($val, ENT_QUOTES, 'UTF-8');
    }
    
    private $request_action;
    
    function get_request_action()
    {
        if (!$this->request_action)
        {
            $this->request_action = $this->_get_request_action();
        }
        return $this->request_action;
    }
    
    private function _get_request_action()
    {
        switch (@$_POST['action'])
        {
            case static::ACTION_INCOMING:
                return new KalSMS_Action_Incoming($this);
            case static::ACTION_OUTGOING:
                return new KalSMS_Action_Outgoing($this);                
            case static::ACTION_SEND_STATUS:
                return new KalSMS_Action_SendStatus($this);
            default:
                return new KalSMS_Action($this);
        }
    }        
    
    function get_request_phone_number()
    {
        return @$_SERVER['HTTP_X_KALSMS_PHONENUMBER'];
    }        
    
    function is_validated_request($correct_password)
    {
        $signature = @$_SERVER['HTTP_X_KALSMS_SIGNATURE'];        
        if (!$signature)
        {
            return false;
        }
        
        $is_secure = (!empty($_SERVER['HTTPS']) AND filter_var($_SERVER['HTTPS'], FILTER_VALIDATE_BOOLEAN));
        $protocol = $is_secure ? 'https' : 'http';
        $full_url = $protocol . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];    
        
        $correct_signature = $this->compute_signature($full_url, $_POST, $correct_password);           
        
        //error_log("Correct signature: '$correct_signature'");
        
        return $signature === $correct_signature;
    }

    function compute_signature($url, $data, $password)
    {
        ksort($data);
        
        $input = $url;
        foreach($data as $key => $value)
            $input .= ",$key=$value";

        $input .= ",$password";
        
        //error_log("Signed data: '$input'");
        
        return base64_encode(sha1($input, true));            
    }
}

class KalSMS_OutgoingMessage
{
    public $id = '';
    public $to;
    public $message;
}

class KalSMS_Action
{
    public $type;    
    public $kalsms;
    
    function __construct($kalsms)
    {
        $this->kalsms = $kalsms;
    }
}

class KalSMS_Action_Test extends KalSMS_Action
{    
    function __construct($kalsms)
    {
        parent::__construct($kalsms);
        $this->type = KalSMS::ACTION_TEST;
    }    
}

class KalSMS_Action_Incoming extends KalSMS_Action
{    
    public $from;
    public $message;

    function __construct($kalsms)
    {
        parent::__construct($kalsms);
        $this->type = KalSMS::ACTION_INCOMING;
        $this->from = $_POST['from'];
        $this->message = $_POST['message'];
    }
    
    function get_response_xml($messages)
    {
        ob_start();
        echo "<?xml version='1.0' encoding='UTF-8'?>\n";
        echo "<Response>";
        foreach ($messages as $message)
        {   
            echo "<Sms id='".KalSMS::escape($message->id)."'>".KalSMS::escape($message->message)."</Sms>";
        }
        echo "</Response>";        
        return ob_get_clean();
    }
}

class KalSMS_Action_Outgoing extends KalSMS_Action
{    
    function __construct($kalsms)
    {
        parent::__construct($kalsms);
        $this->type = KalSMS::ACTION_OUTGOING;
    }
    
    function get_response_xml($messages)
    {
        ob_start();
        echo "<?xml version='1.0' encoding='UTF-8'?>\n";
        echo "<Messages>";
        foreach ($messages as $message)
        {   
            echo "<Sms id='".KalSMS::escape($message->id)."' to='".KalSMS::escape($message->to)."'>".
                KalSMS::escape($message->message)."</Sms>";
        }
        echo "</Messages>";        
        return ob_get_clean();
    }
}

class KalSMS_Action_SendStatus extends KalSMS_Action
{    
    public $status;
    public $id;

    function __construct($type)
    {
        $this->type = KalSMS::ACTION_SEND_STATUS;        
        $this->status = $_POST['status'];
        $this->id = $_POST['id'];
    } 
}