<?php

cw_lock("antibot");
$sess_id = cw_session_id();
cw_session_start($sess_id);
if ($addons['image_verification']) {
    require_once $app_main_dir . "/addons/image_verification/antibot_image.php";
}
function test()
{
    cw_unlock("antibot");
}
register_shutdown_function("test");
function cw_session_read()
{
    global $APP_SESS_ID;
    cw_session_id($APP_SESS_ID);
}
function cw_payment_check_results($payment_data)
{
    $log_payment_failure = false;
    if (!empty($payment_data['sess_id'])) {
        if (cw_check_webinput() == "err") {
            $log_payment_failure = true;
            if ($payment_data['code'] == 1) {
                $__transaction_status = "successful";
                $payment_data['code'] = 3;
            } elseif ($payment_data['code'] == 3) {
                $__transaction_status = "queued";
            } else {
                $__transaction_status = "declined";
            }
            $payment_data['billmes'] = "Gateway reported of {$__transaction_status} transaction but it's response came from the IP that is not specified in the list of valid IPs: " . cw_get_valid_ip($_SERVER['REMOTE_ADDR']) . "\n-- response ----\n" . $payment_data['billmes'];
        }
        $sessurl = APP_SESSION_NAME . "=" . $payment_data['sess_id'] . "&";
        cw_session_id($payment_data['sess_id']);
    } else {
        $sessurl = '';
    }
    $cart =& cw_session_register('cart', array());
    $secure_oid =& cw_session_register("secure_oid");
    $bill_error = $reason = '';
    $fatal = false;
    if (!empty($payment_data)) {
        $saved_payment_data = $payment_data;
    } else {
        $saved_payment_data = false;
    }
    if (empty($secure_oid)) {
        $bill_error = cw_get_langvar_by_name("lbl_error_ccprocessor_error");
        $payment_data['billmes'] = "error: your order was lost";
        $reason = $payment_data['billmes'];
        $fatal = true;
    } elseif (empty($cart) && empty($payment_data['skey'])) {
        $bill_error = cw_get_langvar_by_name("lbl_error_ccprocessor_error");
        $payment_data['billmes'] = "Error: Your cart was lost";
        $reason = $payment_data['billmes'];
        $fatal = true;
    } elseif ($payment_data['code'] == 3) {
        $reason = $payment_data['billmes'];
    } elseif ($payment_data['code'] == 2) {
        $bill_error = cw_get_langvar_by_name("lbl_error_ccprocessor_error");
        $reason = $payment_data['billmes'];
    } elseif ($payment_data['code'] == 1) {
        if (isset($payment_return) && !empty($payment_return) && $payment_data['code'] != 2) {
            if (isset($payment_return['total'])) {
                $sum = 0;
                foreach ($secure_oid as $_oid) {
                    $o = cw_order_data($_oid);
                    $sum += $o['order']['total'];
                }
                if ($sum != doubleval($payment_return['total'])) {
                    $payment_data['code'] = 2;
                    $payment_data['billmes'] .= "; Payment amount mismatch.";
                }
            }
            if ($payment_data['code'] != 2 && isset($payment_return['currency']) && isset($payment_return['_currency']) && !empty($payment_return['_currency']) && $payment_return['currency'] != $payment_return['_currency']) {
                $payment_data['code'] = 2;
                $payment_data['billmes'] .= "; Payment amount mismatch.";
            }
        }
        if ($payment_data['code'] == 1) {
            $payment_data['billmes'] = "Approved: " . $payment_data['billmes'];
        } else {
            $bill_error = cw_get_langvar_by_name("lbl_error_ccprocessor_error");
            $reason = $payment_data['billmes'];
            $payment_data['billmes'] = "Declined: " . $payment_data['billmes'];
        }
    } else {
        # unavailable
        $bill_error = cw_get_langvar_by_name("lbl_error_ccprocessor_unavailable");
        $payment_data['billmes'] = "Error: Payment gateway is unavailable";
    }
    if (!$fatal) {
        cw_load('doc');
        $status_after_capture = cw_call('cw_payment_doc_status_after_capture', array($payment_data));
        $order_status = $bill_error ? "F" : ($payment_data['code'] == 3 ? "Q" : $status_after_capture);
        if (in_array($order_status, array('P', 'Q', $status_after_capture)) && !empty($payment_data['is_preauth'])) {
            $order_status = 'A';
            // Authorized
        }
        if ($payment_data['code'] == 1 || $payment_data['code'] == 3) {
            if (empty($payment_data['skey'])) {
                $cart = array();
            }
        }
        $advinfo = array();
        $advinfo[] = "Reason: " . $payment_data['billmes'];
        if ($payment_data['avsmes']) {
            $advinfo[] = "AVS info: " . $payment_data['avsmes'];
        }
        if ($payment_data['cvvmes']) {
            $advinfo[] = "CVV info: " . $payment_data['cvvmes'];
        }
        if (isset($cmpi_result)) {
            $advinfo[] = "3-D Secure Transaction:";
            if (isset($cmpi_result['Enrolled'])) {
                $advinfo[] = "  TransactionId: " . $cmpi_result['TransactionId'];
                $advinfo[] = "  Enrolled: " . $cmpi_result['Enrolled'];
            } else {
                $advinfo[] = "  PAResStatus: " . $cmpi_result['PAResStatus'];
                $advinfo[] = "  PAResStatusDesc: " . $cmpi_result['PAResStatusDesc'];
                $advinfo[] = "  CAVV: " . $cmpi_result['Cavv'];
                $advinfo[] = "  SignatureVerification: " . $cmpi_result['SignatureVerification'];
                $advinfo[] = "  Xid: " . $cmpi_result['Xid'];
                $advinfo[] = "  EciFlag: " . $cmpi_result['EciFlag'];
            }
            if (!empty($cmpi_result['ErrorNo'])) {
                $advinfo[] = "  ErrorNo: " . $cmpi_result['ErrorNo'];
            }
            if (!empty($cmpi_result['ErrorDesc'])) {
                $advinfo[] = "  ErrorDesc: " . $cmpi_result['ErrorDesc'];
            }
        }
        cw_call('cw_doc_change_status', array($secure_oid, $order_status, join("\n", $advinfo)));
    }
    if (!empty($payment_data['extra_order_data'])) {
        foreach ($secure_oid as $oid) {
            cw_call('cw_doc_place_extras_data', array($oid, $payment_data['extra_order_data']));
        }
        unset($payment_data['extra_order_data']);
    }
    cw_session_unregister("secure_oid");
    cw_session_save();
    return array('bill_error' => $bill_error, 'sessurl' => $sessurl, 'reason' => $reason, 'doc_ids' => $secure_oid);
}