function api_oauth2_access_tokens_fetch_site_token($user = null)
{
    $now = time();
    $site_token = api_oauth2_access_tokens_get_site_token($user);
    if ($site_token && $site_token['expires'] <= $now) {
        $rsp = api_oauth2_access_tokens_delete($site_token);
        if ($rsp['ok']) {
            $user_id = $user ? $user['id'] : 0;
            $cache_key = "oauth2_access_token_site_{$user_id}";
            cache_unset($cache_key);
        }
        $site_token = null;
    }
    # TO DO: error handling / reporting
    if (!$site_token) {
        $rsp = api_oauth2_access_tokens_create_site_token($user);
        $site_token = $rsp['token'];
    }
    return $site_token;
}
function api_oauth2_access_tokens_fetch_site_token($user = null)
{
    $now = time();
    $site_token = api_oauth2_access_tokens_get_site_token($user);
    if ($site_token) {
        $valid_key = 1;
        $valid_token = 1;
        $key = api_keys_get_by_id($site_token['api_key_id']);
        if (!$key) {
            $valid_key = 0;
        } else {
            if ($key['deleted']) {
                $valid_key = 0;
            } else {
                if ($key['expires'] && $key['expires'] <= $now) {
                    $valid_key = 0;
                } else {
                    if ($site_token['expires'] <= $now) {
                        $valid_token = 0;
                    } else {
                        $ttl_key = $key['expires'] - $now;
                        $ttl_token = $site_token['expires'] - $now;
                        if ($ttl_key < 300) {
                            $valid_key = 0;
                        }
                        if ($ttl_token < 300) {
                            $valid_token = 0;
                        }
                    }
                }
            }
        }
        if (!$valid_key || !$valid_token) {
            $rsp = api_oauth2_access_tokens_delete($site_token);
            $user_id = $user ? $user['id'] : 0;
            $cache_key = "oauth2_access_token_site_{$user_id}";
            cache_unset($cache_key);
            $site_token = null;
        }
    }
    # TO DO: error handling / reporting
    if (!$site_token) {
        $rsp = api_oauth2_access_tokens_create_site_token($user);
        $site_token = $rsp['token'];
    }
    return $site_token;
}