<?
### DO THIS FIRST:
require_once("/BANGK!/master_config.php");
require_once($master_config_root_path . "shared/functions.shared");
require_once($master_config_root_path . "shared/session.shared");

//check_and_update_balance_phoneBANGK_background.gate

$transactionid = '';

function add_transaction($memberid, $account, $rate, $balance_before, $balance_after){
    $template = template($master_config_database_company_template);
    
    //phonebangklog("admin[details]",$admin[details]);
    //phonebangklog("admin[details][member][emailaddress]",$admin[details][member][emailaddress]);        
    
    $tmp_datetime = datetime();
    
    $account_details = "ACCOUNTID][" . $account[accountid] . "][ACCOUNTNAME][" . $account[accountname] . "][EMAILADDRESS][" . $account[emailaddress] . "][";
    
    $query = "INSERT INTO `transactions`(
            `transactionid`, 
            `platform`,
            `hash`,    
            `source`, 
            `memberid`, 
            `accountid`,
            `account_details`, 
            `description`, 
            `method`, 
            `method_details`,             
            `transaction_gross_value`,             
            `currency_0_iso3`,
            `currency_0_request`,
            `currency_0_fee`,
            `currency_0_total`,
            `status`, 
            `results`, 
            `account_balance_before`,             
            `transaction_net_value`,             
            `account_balance_after`,
            `requested_datetime`, 
            `updated_datetime`) 
            
            VALUES
            
            ('$blank_id',
            'BANGK.com',
            '". hash_me() ."',                
                'phoneBANGK!',
                '{$memberid}',
                '{$account[accountid]}',
                '{$account_details}',
                'Outgoing',
                'BANGK!',
                '',
                '{$rate}',
                'USD',
                '{$rate}',
                '0',
                '{$rate}',
                'Completed',
                '',
                '{$balance_before}',
                '{$rate}',
                '{$balance_after}',
                NOW(),
                NOW()                
            )";
    
    //phonebangklog("transaction_query",$query);
    $transactionid = insertTHECASHIER($query);
    return $transactionid;
}

function update_transaction($transactionid, $rate, $balance_before, $balance_after){
    $query = "SELECT transaction_gross_value FROM `transactions` WHERE transactionid='". $transactionid ."'";
    $transaction = readTHECASHIER($query);
    //phonebangklog('transaction', $transaction);
    $transaction_gross_value = $transaction->transaction_gross_value+$rate;
    $query = "UPDATE transactions SET transaction_gross_value = ".$transaction_gross_value.", currency_0_request = ".$transaction_gross_value.", currency_0_total = ".$transaction_gross_value.", updated_datetime = NOW() WHERE transactionid='".$transactionid."'";
    //phonebangklog('query', $query);
    $tmp_update_transaction = updateTHECASHIER($query);
    
}

function get_transaction_by_date($accountid, $memberid){
    $trans_date = date('Y-m-d');
    $trans_date_1 = date('Y-m-d', strtotime('+1 day'));
    $query = "SELECT transactionid FROM `transactions` WHERE source= 'phoneBANGK!' AND memberid='". $memberid ."' AND accountid='". $accountid ."' AND requested_datetime>='".$trans_date."' AND requested_datetime<='".$trans_date_1."' LIMIT 1";
    $transaction = readTHECASHIER($query);
    //phonebangklog('query', $query);
    //phonebangklog('transaction', $transaction);
    $return = '';
    if($transaction) $return = $transaction->transactionid;
    return $return;
}

function get_call_rate($dialed_number){
    $return = 'NOT_FOUND';
    $number = $dialed_number;
    $number_array_count = strlen($number);
    while($number_array_count > 0) 
    {
        $prefix_to_lookup = substr($number,0,$number_array_count);
        $query = "SELECT * FROM `flowroute` WHERE prefix=".$prefix_to_lookup."";
        //test('query', $query);

        $rates = arrayTHECASHIER($query, 'voip_rates', false);
        //test('rates', $rates);

        $prefix_found_in_db = $rates;
        if(empty($prefix_found_in_db)) {
            $number_array_count = $number_array_count - 1;
        } 
        else 
        {
            $return = $rates[0];
            break;
        }
    }
    return $return;
    //[result] => Array
    //(
    //    [0] => BANGLADESH (MOBILE) //country
    //    [1] => 88017  //prefix
    //    [2] => 0.0382 //rate
    //)
}

function update_balance($account_hash, $rate, $uuid, $memberid){
    global $transactionid;
    $tmp_account = account($account_hash);
    //phonebangklog('tmp_account', $tmp_account);
    //$tmp_account['accountid']    
    $tmp_balance = balance($tmp_account['accountid']);
    //phonebangklog('tmp_balance', $tmp_balance);
    $balance = $tmp_balance['account_balance'];   
    
    $balance_before = $balance;
    //test('balance before', $balance);
    //Update balance
    $balance -= $rate;
    //test('balance after', $balance);

    $query = "UPDATE balances SET account_balance = ".$balance." WHERE balanceid=".$tmp_balance['balanceid']." AND accountid=".$tmp_balance['accountid']."";
    //phonebangklog('query', $query);
    $tmp_update_balance = updateTHECASHIER($query);
    //test('tmp_update_balance', $tmp_update_balance);

    $phoneBANGKquery = "UPDATE `phoneBANGK_calls` SET rate = ".$rate.", frequncy = frequncy +1 WHERE uuid='".$uuid. "';";
    //phonebangklog('phoneBANGKquery', $phoneBANGKquery);
    $tmp_phoneBANGK_update = updateTHECASHIER($phoneBANGKquery, $name_of_database = 'call_logs');  
    //phonebangklog('tmp_phoneBANGK_update', $tmp_phoneBANGK_update);  
    
    $transactionid = get_transaction_by_date($tmp_account['accountid'], $memberid);
    if(empty($transactionid)){
        $transactionid = add_transaction($memberid, $tmp_account, $rate, $balance_before, $balance);
    }
    else{
        update_transaction($transactionid, $rate, $balance_before, $balance_after);
    }
    
    $return = "OK";
    if($balance<=0) $return = "NOT_ENOUGH_MONEY";
    return $return;
}

function isCallRunning($uuid){
    $query = "SELECT action FROM `phoneBANGK_calls` WHERE uuid='". $uuid ."' and action='STOP_TIMER'";
    $call_log = readTHECASHIER($query, $name_of_database = 'call_logs');
    //phonebangklog('isCallRunning', $query);
    //phonebangklog('isCallRunning', $call_log);
    $return = 'yes';
    if($call_log){
        if($call_log->action == 'STOP_TIMER') $return = 'no';
    }
    return $return;
}

function phonebangklog($key, $value){   
    /*
    $contents = file_get_contents('/var/www/html/gateway/phoneBANGK.log');
    $contents .= $key . ': ' . print_r($value, true) . "\n";
    file_put_contents('/var/www/html/gateway/phoneBANGK.log', $contents);
    */
}

if(!empty($_GET['uuid'])) $argv[1] = $_GET['uuid'];
$uuid = $argv[1];

//Get user_id, dialed number
$query = "SELECT user_id, dialed_number FROM `phoneBANGK_calls` WHERE uuid='". $uuid ."'";
$call_log = readTHECASHIER($query, $name_of_database = 'call_logs');
$user_id = $call_log->user_id;
$dialed_number = $call_log->dialed_number;
//test("call_log", $call_log);

//Get memeber
$query = "SELECT memberid FROM `members` WHERE phonebangk_username='". $user_id ."'";
//test("query", $query);
$member = readTHECASHIER($query);
$memberid = $member->memberid;
//phonebangklog("memberid", $memberid);

//Get personal account hash
$query = "SELECT hash FROM accounts WHERE accounttype = 'Personal' AND creator_memberid = '$memberid';";
//test("query", $query);
$account = readTHECASHIER($query);
$account_hash = $account->hash;
//phonebangklog("account_hash", $account_hash);

$rate_result = get_call_rate($dialed_number);
//phonebangklog("rate_result", $rate_result);


if(!empty($account_hash) && $rate_result != 'NOT_FOUND'){
    $rate = $rate_result[2];    
    //phonebangklog("rate", $rate);
    
    $run = 'yes';
    while($run=='yes'){ 
        if(isCallRunning($uuid)=='yes'){
            phonebangklog('run', $run . ', time=' . time());
            $update_result = update_balance($account_hash, $rate, $uuid, $memberid);        
            phonebangklog('update_result', $update_result . ', time=' . time() . ', account_hash=' . $account_hash);
            if(empty($update_result)){
                $run = 'no';
            }
            else if($update_result == 'NOT_ENOUGH_MONEY'){
                $run = 'no';
                //hangup
                $command = "kill";
                $_GET['command'] = $command;
                $_GET['uuid'] = $uuid;            
                include("/var/www/html/authorizations/freeswitch.auth");            
            } 
            else{
                sleep(60);
            }
        }
        else { //call has been stopped
            $run = 'no';
        }
    }   
}
else{
    $command = "kill";
    $_GET['command'] = $command;
    $_GET['uuid'] = $uuid;
    include("/var/www/html/authorizations/freeswitch.auth");
}

?>