#!/usr/bin/env php
<?php
/**
 * Test script to simulate the logic from htdocs/asterisk/wrapper.php
 * This script tests the Twilio SIP call functionality without actually making real calls
 */

// Simulate the environment and required constants
if (!defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1');
if (!defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1');
if (!defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1');
if (!defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1');
if (!defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1');
if (!defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1');

// Mock the required functions
function GETPOST($param, $type = '') {
    // Simulate getting parameters from URL
    $test_data = [
        'login' => 'testuser',
        'password' => 'testpass',
        'caller' => '+1234567890',
        'called' => '+0987654321'
    ];
    
    return isset($test_data[$param]) ? $test_data[$param] : '';
}

function getEntity($entity) {
    return "1"; // Simulate default entity
}

function accessforbidden() {
    echo "Access forbidden\n";
    exit(1);
}

function isModEnabled($module) {
    // Simulate that clicktodial module is enabled
    return $module === 'clicktodial';
}

// Mock database functions
class MockDB {
    public function escape($string) {
        return addslashes($string);
    }
    
    public function plimit($limit) {
        return " LIMIT $limit";
    }
    
    public function query($sql) {
        echo "Executing SQL: $sql\n";
        // Simulate a successful query result
        return true;
    }
    
    public function num_rows($result) {
        return 1;
    }
    
    public function fetch_object($result) {
        $obj = new stdClass();
        $obj->name = "Test Company";
        return $obj;
    }
    
    public function free($result) {
        // Do nothing
    }
    
    public function close() {
        echo "Database connection closed\n";
    }
}

// Mock configuration
class MockConf {
    public $global;
    
    public function __construct() {
        $this->global = new stdClass();
        $this->global->ASTERISK_HOST = 'cbeezaivoip.sip.twilio.com';
        $this->global->ASTERISK_PORT = 5060;
        $this->global->ASTERISK_TYPE = 'SIP/';
        $this->global->ASTERISK_CONTEXT = 'from-internal';
        $this->global->ASTERISK_WAIT_TIME = '30';
        $this->global->ASTERISK_PRIORITY = '1';
        $this->global->ASTERISK_MAX_RETRY = '2';
        $this->global->ASTERISK_INDICATIF = '';
    }
}

// Mock constants
define('MAIN_DB_PREFIX', 'llx_');

// Initialize mock objects
$db = new MockDB();
$conf = new MockConf();

/**
 * Minimal header
 */
function llxHeader($head = '', $title = '', $help_url = '', $target = '', $disablejs = 0, $disablehead = 0)
{
    echo "=== Twilio SIP Bridge Test ===\n";
}

/**
 * Minimal footer
 */
function llxFooter($comment = '', $zone = 'private', $disabledoutputofmessages = 0)
{
    echo "=== End of Test ===\n";
}

// Security check
if (!isModEnabled('clicktodial')) {
    accessforbidden();
}

/* ---------------------------------------------------------
 * TWILIO SIP CONFIGURATION (UPDATE THESE)
 * --------------------------------------------------------- */
echo "Twilio SIP Configuration:\n";
echo "- Host: " . $conf->global->ASTERISK_HOST . "\n";
echo "- Port: " . $conf->global->ASTERISK_PORT . "\n";
echo "- Type: " . $conf->global->ASTERISK_TYPE . "\n";
echo "- Context: " . $conf->global->ASTERISK_CONTEXT . "\n";
echo "- Wait Time: " . $conf->global->ASTERISK_WAIT_TIME . "\n";
echo "- Priority: " . $conf->global->ASTERISK_PRIORITY . "\n";
echo "- Max Retry: " . $conf->global->ASTERISK_MAX_RETRY . "\n";
echo "- Indicatif: " . $conf->global->ASTERISK_INDICATIF . "\n\n";

/* ---------------------------------------------------------
 * FETCH URL PARAMETERS
 * --------------------------------------------------------- */
$login = GETPOST('login', 'alphanohtml');
$password = GETPOST('password', 'password');
$caller = GETPOST('caller', 'alphanohtml');
$called = GETPOST('called', 'alphanohtml');

$login = preg_replace('/[\n\r]/', '', $login);
$password = preg_replace('/[\n\r]/', '', $password);
$caller = preg_replace('/[\n\r]/', '', $caller);
$called = preg_replace('/[\n\r]/', '', $called);

$strHost = $conf->global->ASTERISK_HOST;
$port = $conf->global->ASTERISK_PORT;
$channel = $conf->global->ASTERISK_TYPE;
$strWaitTime = $conf->global->ASTERISK_WAIT_TIME;
$strPriority = $conf->global->ASTERISK_PRIORITY;
$strContext = $conf->global->ASTERISK_CONTEXT;
$strMaxRetry = $conf->global->ASTERISK_MAX_RETRY;

echo "Parameters:\n";
echo "- Login: $login\n";
echo "- Password: [HIDDEN]\n";
echo "- Caller: $caller\n";
echo "- Called: $called\n\n";

/* ---------------------------------------------------------
 * SEARCH CONTACT NAME (OPTIONAL)
 * --------------------------------------------------------- */
$sql = "SELECT s.nom as name FROM " . MAIN_DB_PREFIX . "societe as s";
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "socpeople as sp ON sp.fk_soc = s.rowid";
$sql .= " WHERE s.entity IN (" . getEntity('societe') . ")";
$sql .= " AND (s.phone='" . $db->escape($called) . "'";
$sql .= " OR sp.phone='" . $db->escape($called) . "'";
$sql .= " OR sp.phone_perso='" . $db->escape($called) . "'";
$sql .= " OR sp.phone_mobile='" . $db->escape($called) . "')";
$sql .= $db->plimit(1);

$resql = $db->query($sql);
$found = ($resql && $db->num_rows($resql)) ? $db->fetch_object($resql)->name : 'Unknown';
if ($resql) $db->free($resql);

echo "Contact Search:\n";
echo "- SQL Query: $sql\n";
echo "- Found Contact: $found\n\n";

/* ---------------------------------------------------------
 * INITIATE TWILIO SIP CALL
 * --------------------------------------------------------- */
llxHeader();

if (empty($caller) || empty($called)) {
    echo "⚠️ Missing caller or called number.\n";
    llxFooter();
    exit;
}

// Construct the SIP URIs
$fromUri = "sip:" . urlencode($caller) . "@cbeezaivoip.sip.twilio.com";
$toUri = "sip:" . urlencode($called) . "@cbeezaivoip.sip.twilio.com";

echo "Initiating Twilio SIP call...\n";
echo "- Caller: $caller\n";
echo "- Called: $called\n";
echo "- Contact: $found\n";
echo "- From URI: $fromUri\n";
echo "- To URI: $toUri\n\n";

/* ---------------------------------------------------------
 * ACTUAL CALL LOGIC (USING Twilio API) - SIMULATED
 * --------------------------------------------------------- */

$twilioAccountSid = 'AC5a5fcad9fd324d3b64959202f1da2289';
$twilioAuthToken  = '06afaebb1bfc5da8cbda9359d5d8c6d8';
$twilioSoftphoneNumber = '+16812062628'; // Example: +14155551234

echo "Twilio API Call (Simulated):\n";
echo "- Account SID: $twilioAccountSid\n";
echo "- Auth Token: [HIDDEN]\n";
echo "- Softphone Number: $twilioSoftphoneNumber\n";

// Simulate the Twilio API call
echo "- API Endpoint: https://api.twilio.com/2010-04-01/Accounts/$twilioAccountSid/Calls.json\n";
echo "- Request Method: POST\n";
echo "- Request Parameters:\n";
echo "  - From: sip:$caller@cbeezaivoip.sip.twilio.com\n";
echo "  - To: sip:$called@cbeezaivoip.sip.twilio.com\n";
echo "  - Url: https://handler.twilio.com/twiml/EH4cf4e395d9cb956f5b996e9bfbf07761\n\n";

// Simulate a successful response
$response = json_encode([
    'sid' => 'CA1234567890abcdef1234567890abcdef',
    'status' => 'queued',
    'from' => "sip:$caller@cbeezaivoip.sip.twilio.com",
    'to' => "sip:$called@cbeezaivoip.sip.twilio.com"
]);

$result = json_decode($response, true);
if (isset($result['sid'])) {
    echo "✅ Call initiated successfully! SID: {$result['sid']}\n";
} else {
    echo "⚠️ Failed to initiate call.\n";
    echo "Response: " . json_encode($response, JSON_PRETTY_PRINT) . "\n";
}

llxFooter();
$db->close();

echo "\nTest completed successfully!\n";
?>