<?php

define('HOST', 'click.validclick.net');
define('BID', '0.02');
define('HASH_KEY', 'RzhEBqaw9I1hdT9');

/**
 * Generate AdMedia click URL
 *
 * @param int $affiliate_id
 * @param string $affiliate_name
 * @param array $feedDetails feed_campaign_affiliate_mapping row
 * @param array $data product data
 *
 * @return string
 */
function generateClickUrl(
    int    $affiliate_id,
    string $affiliate_name,
    array  $feedDetails,
    array  $data
): string {

    $keyword = '';
    $ip = '';
    $ua = '';

    $feed = $feedDetails;

    $redirect = $data['redirect_url'];
    $subid = $data['sub_id'] ?? '';
    $type = '';

    $tstamp = time() + (60 * 60 * 24 * 2); // 2 Days
    $unique_clickid = time() . rand(1000000, 9999999) . $feed['campaign_id'];

    $parsedUrl = parse_url($redirect);
    $separator = (isset($parsedUrl['query']) && $parsedUrl['query'] === null)
        ? '?'
        : '&';

    $redirect_url =
        str_replace('`', '', $redirect) .
        $separator .
        'ca=' . $feed['adv_id'];

    $encrypted_target = encrypt_str(
        $unique_clickid . "::" .
        $keyword . "::" .
        $affiliate_id . "::" .
        $feed['adv_id'] . "::" .
        $feed['campaign_id'] . "::" .
        0 . "::" .
        BID . "::" .
        $redirect_url . "::" .
        $tstamp . "::" .
        '' . "::" .
        $ip . "::" .
        $ua . "::" .
        0 . "::" .
        'CPC' . "::" .
        0 . "::" .
        '' . "::" .
        '' . "::" .
        1
    );

    $et = urlencode($encrypted_target);

    $click_url =
        "http://" . $feed['campaign_id'] . "." . HOST .
        "/cad.php" .
        "?given_feed_id=" . $feed['feed_id'] .
        "&given_xmlfeed=" . $feed['feed_name'] .
        "&given_affiliate_id=" . $affiliate_id .
        "&affiliate=" . $affiliate_name .
        "&utm_source=" . $feed['campaign_id'] .
        "&utm_medium=" . strtolower($type) . "_" . $affiliate_id .
        "&mc=" . $et .
        "&adv=" . $feed['adv_id'] .
        "&country=us&fqp=1&shopfeed=1&feedapi=1";

    if (!empty($subid)) {
        $click_url .= "&given_subid=" . $subid;
    }

    return $click_url;
}

function encrypt_str(string $str): string {
    $encrypted = crypto($str);
    $encoded = base64_encode($encrypted);
    return strtr($encoded, '+/=', '-_,');
}

function crypto(string $str): string {
    $ky = str_replace(chr(32), '', HASH_KEY);
    if (strlen($ky) < 8) {
        exit('key error');
    }

    $kl = strlen($ky) < 32 ? strlen($ky) : 32;
    $k = [];

    for ($i = 0; $i < $kl; ++$i) {
        $k[$i] = ord($ky[$i]) & 0x1F;
    }

    $j = 0;
    for ($i = 0; $i < strlen($str); ++$i) {
        $e = ord($str[$i]);
        $str[$i] = $e & 0xE0 ? chr($e ^ $k[$j]) : chr($e);
        ++$j;
        $j = $j == $kl ? 0 : $j;
    }

    return $str;
}