<?php

/**
 * name    : Redirect
 * Author  : Benji
 * Last Modification : 10-03-2022
 *
 * Desc    :
 *
 */
class Redirect
{
    public $isOfferRedirection = true;
    private $_url = array(
        'input' => '',
        'decoded' => '',
        'prod' => '',
    );
    private $_entered;
    private $_page = '';
    private $_values = array(
        'list_id' => 0,
        'client_id' => 0,
        'affiliate_offer_id' => 0,
        'offer_from_id' => 0,
        'offer_subject_id' => 0,
        'creative_id' => 0,
        'entity_id' => 0,
        'spi_id' => 0,
        'affiliate_id' => 0,
        'isp_id' => 0,
        'team_entity_id' => 0,
        'deploy_id' => 0,
        'mailer_id' => 0,
        'domain_id' => 0,
        'module_id' => 0
    );
    private $_additionalParams = array(
        'fn' => '',
        'ln' => '',
        'em' => ''
    );
    private $_detectedAs = '';
    private $_storeIn = '';
    private $_selectOfferFrom = '.';
    private $_offerLinkRestrictions = true;
    private $_trackingService = null;

    private $_C1;  // tracking element
    private $_C2;  // tracking element
    private $_C3;  // tracking element

    public function __construct($url, $encoded = true)
    {

        $this->_entered = date('Y-m-d H:i:s');
        if ($encoded) $this->extractAdditionalParams($url);
        $this->_url['input'] = $url;

        $decodedUrl = exec("mailingtool-url decode='{$url}'");
        $decodedUrl = json_decode($decodedUrl, true);

        if ($decodedUrl['status'] == 'error') {
            $this->isOfferRedirection = false;
            $this->forward();
        }

        $typeOfEncoding = $decodedUrl['data']['type'];
        $url = $decodedUrl['data']['url-query'];
        #####################################################
        if (RESTRICTED_LINKS != 'none') {
            $restricted_links = explode(',', RESTRICTED_LINKS);
            if (! in_array($typeOfEncoding, $restricted_links))
                Url::renderErrorPage(403, 'Restricted link type: ' . $typeOfEncoding);
        }

        #####################################################
        $url = Url::parse($url);
        if (!$url) {
            Url::renderErrorPage(404, 'URL parse failed in constructor');
        }
        $this->_values = $url['query'];
        $this->_page = $url['path'];
        $this->_url['decoded'] = $url['decoded_url'];
        ######################################################
        // RESTRICTED_LINKS_BY_ISP: encoding types allowed only on specific ISPs
        // Format: JSON object, e.g. {"type51": [12,14,26,27,28]}
        // If the encoding type is listed here and the ISP is NOT in the allowed list => 403
        if (RESTRICTED_LINKS_BY_ISP != '{}') {
            $ispRestrictions = json_decode(RESTRICTED_LINKS_BY_ISP, true);
            if (is_array($ispRestrictions) && array_key_exists($typeOfEncoding, $ispRestrictions)) {
                $ispId = isset($this->_values['isp_id']) ? (int) $this->_values['isp_id'] : 0;
                $allowedIsps = $ispRestrictions[$typeOfEncoding];
                if (is_array($allowedIsps) && ! in_array($ispId, $allowedIsps)) {
                    Url::renderErrorPage(403, 'Link type not allowed for ISP ');
                }
            }
        }

        ######################################################
        if (RESTRICTED_ENTITIES != 'none') {
            $restricted_entities = explode(',', RESTRICTED_ENTITIES);
            if (! in_array($this->_values['entity_id'], $restricted_entities))
                Url::renderErrorPage(403, 'Restricted entity: ' . $this->_values['entity_id']);
        }
        ######################################################

    }


    public function run()
    {

        switch ($this->_page) {
            case 'redirect.php':
                $this->store('click');
                $this->_url['prod'] = $this->getOfferLinkNewFormat('redirect_url');
                break;
            case 'advunsub.php':
            case 'unsub_adv.php':
                $this->store('unsubscribe', 1);
                $this->_url['prod'] = $this->getOfferLinkNewFormat('advunsub_url');
                break;
            case 'optdown.php':
                $this->store('unsubscribe', 2);
                $this->_url['prod'] = "{$_SERVER['HTTP_HOST']}/optdown.php?n=" . rand(5, 8);
                break;
            case 'unsub.php':
                $this->store('unsubscribe', 3);
                $this->_url['prod'] =  $_SERVER['HTTP_HOST'] . '/' . SUCCEED_UNSUBSCRIBE_PAGE;
                break;
            case 'open.php':
                $this->store('open');
                return $this->log();
                break;
            case 'about.php':
                $this->_url['prod'] = $this->getOfferLinkNewFormat('about_url');
                break;
            case 'privacy.php':
                $this->_url['prod'] = $this->getOfferLinkNewFormat('privacy_url');
                break;
            case 'conditions.php':
                $this->_url['prod'] = $this->getOfferLinkNewFormat('condition_url');
                break;
            case 'browser.php':
                $this->store('click');
                $url = base64_encode($this->_values['deploy_id'] . "_" . $this->_values['ip_id'] . "_" . $this->_values['list_id'] . "_" . $this->_values['client_id'] . "_" . $this->_values['domain_id']);
                $this->_url['prod'] =  NAV_DOMAIN . "/?q=" . $url;
                break;
            case 'robot.php':
                $this->store('click', 0, 1);
                $this->_url['prod'] = $this->getOfferLinkNewFormat('redirect_url');
                break;
            default:
                Url::renderErrorPage(404, 'Unknown page in switch: ' . $this->_page);
        }

        $this->replaceTags();
        $this->log();


        if (!isset($this->_url['prod']) || $this->_url['prod'] == '') {
            Url::renderErrorPage(404, 'Empty prod URL after run() for page: ' . $this->_page);
        }

        header('location:' . Utils::addHttpProtocol($this->_url['prod']));
    }
    private function isUrlOfTest()
    {
        if (in_array($this->_values['client_id'], array(-1, 0, 1))) {
            return true;
        }
        return false;
    }

    private function generateC1C2C3($linkVersion = 2)
    {
        if ($linkVersion == 2) {
            $this->_C1 = $this->_values['affiliate_offer_id'] . "_" . $this->_values['deploy_id'] . "_" . $this->_values['isp_id'] . '_' . $this->_values['mailer_id'] . '_' . $this->_values['entity_id'];
            $this->_C2 = $this->_values['list_id'] . "_" . $this->_values['client_id'] . "_" . $this->_values['offer_from_id'] . "_" . $this->_values['offer_subject_id'] . "_" .
                $this->_values['creative_id'] . "_" . $this->_values['spi_id'] . "_" . $this->_values['entity_id'] . "_" . $this->_values['mailer_id'] . "_" .
                $this->_values['domain_id'] . "_" . $this->_values['deploy_id'] . "_" . $this->_values['module_id'] . "_" . $this->_values['team_entity_id'];
            $this->_C2  = Utils::encryptTracking($this->_C2);
            $this->_C3 = $this->_values['entity_id'];
        } else {
            $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $symbols = ['-', '_', '.', '~'];

            // 2. Helper function to grab a truly random string of a specific length
            $getNoise = function ($len) use ($chars) {
                return substr(str_shuffle(str_repeat($chars, 5)), 0, $len);
            };

            // 3. Helper to grab a random symbol
            $getSym = function () use ($symbols) {
                return $symbols[array_rand($symbols)];
            };

            // 4. Construct the pieces randomly
            // Prefix: random string or symbol (always non-empty)
            $randPrefix = rand(0, 2);
            if ($randPrefix <= 1) {
                $prefix = $getNoise(rand(2, 4)); // e.g., "A7b"
            } else {
                $prefix = $getSym();             // e.g., "@"
            }
            $prefix = trim($prefix);
            if ($prefix === '' || preg_match('/[\t\n\r\s]/', $prefix)) {
                $prefix = $getNoise(rand(2, 4));
            }

            // Separator: Randomly pick between a symbol or a noise string
            $separator = (rand(0, 1) === 0) ? $getSym() : $getNoise(rand(2, 5));
            $separator = trim($separator);
            if ($separator === '' || preg_match('/[\t\n\r\s]/', $separator)) {
                $separator = $getSym();
            }

            // Suffix: random noise string (always non-empty)
            $suffix = $getNoise(rand(2, 4));
            $suffix = trim($suffix);
            if ($suffix === '' || preg_match('/[\t\n\r\s]/', $suffix)) {
                $suffix = $getNoise(rand(2, 4));
            }

            //$this->_C1 = $this->_values['deploy_id'] . "-" . $this->_values['mailer_id']; // random
            $this->_C1 = str_replace(' ', '', $prefix . $this->_values['deploy_id'] . $separator . $this->_values['mailer_id'] . $suffix);
            $this->_C2 = $this->_values['list_id'] . "_" . $this->_values['client_id'] . "_" . $this->_values['offer_from_id'] . "_" . $this->_values['offer_subject_id'] . "_" . $this->_values['creative_id'] . "_" . $this->_values['spi_id'] . "_" . $this->_values['entity_id'] . "_" . $this->_values['mailer_id'] . "_" . $this->_values['domain_id'] . "_" . $this->_values['deploy_id'] . "_" . $this->_values['module_id'] . "_" . $this->_values['team_entity_id'] . "_" . $this->_values['affiliate_offer_id'] . "_" . $this->_values['isp_id'];
            $this->_C2  = Utils::encryptTracking($this->_C2, 'obfuscator');
        }
        return [
            1 => $this->_C1,
            2 => $this->_C2,
            3 => $this->_C3
        ];
    }

    private function replaceTags()
    {
        $this->generateC1C2C3($this->_values['link_version'] ?? 2);
        $this->_url['prod'] = str_replace("[C1]", $this->_C1, $this->_url['prod']);
        $this->_url['prod'] = str_replace("[C2]", $this->_C2, $this->_url['prod']);
        $this->_url['prod'] = str_replace("[C3]", $this->_C3, $this->_url['prod']);
        $this->_url['prod'] = str_replace("[OPTINFO]", $this->_C1 . "_" . $this->_C2, $this->_url['prod']);
        $this->_url['prod'] = str_replace("[FN]", $this->_additionalParams['fn'], $this->_url['prod']); # fn = first name
        $this->_url['prod'] = str_replace("[LN]", $this->_additionalParams['ln'], $this->_url['prod']); # ln = last name
        $this->_url['prod'] = str_replace("[EMAIL]", $this->_additionalParams['em'], $this->_url['prod']); # em = Email
        if (preg_replace('/\[(C[45])\]/', '', $this->_url['prod'])) {
            $clientToken = $this->getClientToken();
            $this->_url['prod'] = str_replace("[C4]", $clientToken[0], $this->_url['prod']);
            $this->_url['prod'] = str_replace("[C5]", $clientToken[1], $this->_url['prod']);
        }
    }

    private function store($prefix, $type = 0, $is_robot = 0)
    {
        // $type =>  0 click, 1 = unsub_adv, 2 = optdown, 3 = unsub

        $merge = array('entered' => $this->_entered, 'is_robot' => $is_robot);

        if ($prefix == 'unsubscribe')
            $merge["type"] = $type;

        $this->_values = array_merge(
            $merge,
            $this->_values,
            Utils::getClientInfo()
        );

        if ($this->skipStoring($prefix)) {
            $this->_storeIn = 'SKIPPED DUE TO DUPLICATION';
            return;
        }

        $this->storeInFile($prefix,  FLUENTBIT_DIR); //fluentbit usage
        // store action in file if exists in the config
        if (! in_array($prefix, json_decode(STORE_ACTION_IN_DB, true))) {
            $this->storeInFile($prefix);
        } else {
            if ($this->storeInDb($prefix) == 0) {
                $this->storeInFile($prefix);
            }
        }
    }

    private function storeInFile($prefix, $basedir = CURRENT_DIR)
    {

        $filename = uniqid(ARCHIVE_PREFIX . '_' . $prefix . '_', true);
        #$this->_storeIn = $type . '_FILE';
        /////////////////////////////////
        $this->_values['random'] = $filename;
        file_put_contents(
            $basedir . DS . $filename,
            json_encode($this->_values) . "\n",
            true
        );
    }

    private function storeInDb($prefix)
    {
        require_once 'classes/ActionsRecorder.php';

        $rec = new ActionsRecorder($prefix, $this->_values, true);
        $this->_storeIn = 'DB';
        return $rec->record();
    }


    private function getOfferLinkNewFormat($column = 'redirect_url')
    {
        // Seeds check first — no DB call needed
        $filter_seeds_actions = json_decode(FILTER_SEEDS_ACTIONS, true);
        if (!empty($filter_seeds_actions) && in_array($this->_values['module_id'], array(121, 221, 222))) {
            $this->_detectedAs = 'SEEDS';
            return $this->filter($filter_seeds_actions);
        }

        // Single DB call via the service (handles trackdb → prodb failover)
        $res = $this->getTrackingService()->getRedirectionLinks(
            (int) $this->_values['affiliate_offer_id'],
            CLIENT_IP
        );

        // Bulk-store all returned metadata
        $this->_values = array_merge($this->_values, array(
            'redirect_url'          => $res['redirect_url'],
            'advunsub_url'          => $res['advunsub_url'],
            'unsub_url'             => $res['unsub_url'],
            'about_url'             => $res['about_url'],
            'privacy_url'           => $res['privacy_url'],
            'condition_url'         => $res['condition_url'],
            'prepop'                => $res['prepop'],
            'is_int'                => $res['is_int'],
            'is_bot'                => $res['is_bot'],
            'link_version'          => $res['link_version'],
            'source'                => $res['source'],
            'original_redirect_url' => $res['original_redirect_url'],
        ));

        // Apply restrictions using data already fetched (no second DB call)
        $filter_bot_actions = json_decode(FILTER_BOT_ACTIONS, true);
        if (!empty($filter_bot_actions) && $res['is_bot']) {
            $this->_detectedAs = 'BOT';
            return $this->filter($filter_bot_actions);
        }

        $filter_international_actions = json_decode(FILTER_INTERNATIONAL_ACTIONS, true);
        if (!empty($filter_international_actions) && $res['is_int']) {
            $this->_detectedAs = 'INT';
            return $this->filter($filter_international_actions);
        }

        if (isset($res['affiliate_offers_rules'])) {
            $this->checkRules($column, $res['affiliate_offers_rules']);
        }

        $this->_selectOfferFrom .= " >>> " . $res['source'] . "( NEW FORMAT )";
        return $res[$column];
    }

    /**
     * Lazy-initialize the TrackingRedirectService (one instance per request).
     */
    private function getTrackingService()
    {
        if ($this->_trackingService === null) {
            $this->_trackingService = new \App\Services\Tracking\TrackingRedirectService(
                Utils::readConfigurationFile('REDIRECT', DB_CONFIG_FILE),
                Utils::readConfigurationFile('SAFE_REDIRECT', DB_CONFIG_FILE)
            );
        }
        return $this->_trackingService;
    }

    private function getClientToken()
    {
        // Create cache filename using isp_id and client_id
        $cache_file = OFFER_CACHE_DIR . DS . "token_{$this->_values['isp_id']}_{$this->_values['client_id']}";
        $default_token =  array(13, '307a435553616f733441506531384c326e6e627432413d3d');
        // Check if cache file exists and is less than 1 hour old
        if (file_exists($cache_file) && (time() - filemtime($cache_file) < 3600)) {
            return explode(',', file_get_contents($cache_file));
        }

        if (strpos($this->_values['client_id'], '0') === 0)
            return $default_token;

        $connection = null;
        try {
            $connection = Utils::createConnection('SAFE_REDIRECT');
            $query = "SELECT segment, token_id FROM tracking.client_tokens WHERE isp_id=$1 AND client_id=$2";
            $result = pg_query_params($connection, $query, array(
                $this->_values['isp_id'],
                $this->_values['client_id']
            ));

            //$token = $result ? pg_fetch_row($result) : $default_token;
            if ($result && ($row = pg_fetch_row($result))) {
                $token = $row;
            } else {
                $token = $default_token;
            }

            // Cache the result
            file_put_contents($cache_file, implode(',', $token));

            return $token;
        } catch (Exception $e) {
            error_log($e->getMessage());
            return $default_token;
        }
        if ($connection) {
            pg_close($connection);
        }
        return $default_token;
    }


    //    public function replaceUrlPrepopTags($url)
    //    {
    //        $query = sprintf("select * from udata.getInfo(%s) limit 1;", (int)$this->_values['client_id']);
    //        $result = pg_query($query);
    //        $infos = array('email' => '', 'fname' => '', 'lname' => '');
    //        if ($result = pg_fetch_array($result)) {
    //            $infos = $result;
    //        }
    //        return str_replace(
    //            array('[EMAIL]', '[FNAME]', '[LNAME]'),
    //            array($infos['email'], $infos['fname'], $infos['lname']),
    //            $url
    //        );
    //    }

    private function forward()
    {
        static $forward_to_doms = null;
        if ($forward_to_doms === null) {
            $forward_to_doms = json_decode(FORWARD_HOST, true) ?: [];
        }

        $to = $this->filter($forward_to_doms);

        if ($to !== $_SERVER['HTTP_HOST']) {
            header('Location: http://' . $to . $_SERVER['REQUEST_URI'], true, 301);
            exit();
        }

        $brand = new Brand();
        $brand->showBrandLink($this->_url['input']);
        exit();
    }

    private function log()
    {
        $title = 'LONG URL';

        $logSelectOfferFrom = "\n" . '[URL SOURCE] => ' . $this->_selectOfferFrom . "\n";

        $logStoreIn = '[STORED IN] => ' . $this->_storeIn . "\n";

        $logUrlRedirectEncoded = '[URL REDIRECT ENCODED] => ' . $this->_url['input'] . "\n";

        $logUrlRedirect = '[URL REDIRECT] => ' . $this->_url['decoded'] . "\n";

        $logUrlFinal = '[URL CLIENT] => ' . ($this->_detectedAs != '' ? 'DETECTED AS (' . $this->_detectedAs . ") REDIRECTED TO --> " : "") . $this->_url['prod'] . "\n";

        $_SERVER['HTTP_USER_AGENT'] = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';

        $logAgentUserAndIpClient = '[ip client & User Agent] => ' . CLIENT_IP . '   ' . $_SERVER['HTTP_USER_AGENT'];

        $content = '{' . "\n$logSelectOfferFrom\n$logStoreIn\n$logUrlRedirectEncoded\n$logUrlRedirect\n$logUrlFinal\n$logAgentUserAndIpClient\n" . ' }';
        Utils::createLog(LOG_REDIRECT, "LOG URLS ($title)", $content);
    }



    private function filter($matchConfig)
    {

        $host = $_SERVER['HTTP_HOST'];
        if (isset($matchConfig[$host])) {
            $paths = $matchConfig[$host];
            if (!empty($paths)) {
                $randomPath = $paths[array_rand($paths)];
                return $randomPath;
            } else {
                return $host;
            }
        } else {
            // If the domain is not explicitly defined, use the wildcard value
            $wildcardPaths = isset($matchConfig['*']) ? $matchConfig['*'] : array();
            if (!empty($wildcardPaths)) {
                return $wildcardPaths[array_rand($wildcardPaths)];
            } else {
                return $host;
            }
        }
    }

    private function extractAdditionalParams(&$url)
    {
        $arrHelper = explode('___', $url);
        if (count($arrHelper) > 1) {
            $url = $arrHelper[0];
            $addParams = base64_decode($arrHelper[1]);
            parse_str($addParams);
            $this->_additionalParams['fn'] = isset($fn) ? $fn : '';
            $this->_additionalParams['ln'] = isset($ln) ? $ln : '';
            $this->_additionalParams['em'] = isset($em) ? $em : '';
        }
    }

    private function skipStoring($prefix = 'click')
    {
        $timeFilter = STORE_SKIP_TIME; // seconds
        $values = $this->_values;
        $fileNameComponents = array(
            date('Ymd'),
            $values['host'],
            $values['client_ip'],
            $values['entity_id'],
            $values['affiliate_id'],
            $values['isp_id'],
            $values['mailer_id'],
            $values['affiliate_offer_id'],
            $values['list_id'],
            $values['client_id'],
            $values['deploy_id'],
            $values['offer_from_id'],
            $values['offer_subject_id'],
            $values['spi_id'],
            $values['domain_id'],
            $values['creative_id'],
            $values['module_id'],
            $values['team_entity_id']
        );

        $file = TMP_DIR . DS . $prefix . '_' . implode('_', $fileNameComponents);

        if (file_exists($file)) {
            $fileAge = time() - filemtime($file);
            if ($fileAge <= $timeFilter) {
                return true;
            }
            unlink($file);
        } else {
            touch($file);
        }
        return false;
    }

    private function checkRules($page, $db_rules)
    {
        $rules = json_decode($db_rules, true)['stop_redirect'] ?? [];
        $query = explode('?', $this->_url['decoded'], 2)[1];
        $params = [];
        parse_str($query, $params);

        foreach ($rules  as $index => $rule) {
            if (empty(array_intersect([$page, 'all'], $rule['link']))) {
                continue; // if the rule does not apply to the current page, we skip it
            }
            $checked = true;
            foreach ($rule as $key => $value) {
                if (in_array($key, ['link']) || empty($value)) {
                    continue; // skip link key and null values
                }

                $rule_values = explode(',', $value);
                $param_value = $params[$key] ?? null;
                if (! in_array($param_value, $rule_values)) {
                    $checked = false;
                    break; // if any of the rule values does not match the corresponding value in the URL, we skip to the next rule
                } else {
                    $checked = true; // if the value matches, we continue checking the other values of the rule
                }
            }

            if ($checked == true) {
                Url::renderErrorPage(404);
            }
        }
    }
}
