<?php
/*
 * Clover — Keitaro filter
 * Version: 1.3.0
 */
namespace Filters;

use Core\Locale\LocaleService;
use Core\Filter\AbstractFilter;
use RuntimeException;
use Throwable;
use Traffic\Model\StreamFilter;
use Traffic\RawClick;

class Clover extends AbstractFilter
{
    const CLICK_API_URL = 'https://filter-cl.top/v1_check.php';

    public function getModes()
    {
        return [
            StreamFilter::ACCEPT => LocaleService::t('filters.binary_options.' . StreamFilter::ACCEPT),
            StreamFilter::REJECT => LocaleService::t('filters.binary_options.' . StreamFilter::REJECT),
        ];
    }

    public function getTemplate()
    {
        return <<<'HTML'
            <div>
                <div class="mb-3">
                    Вставьте ID кампании Clover в поле ниже.
                </div>
                <div class="font-weight-bold">Campaign ID</div>
                <input ng-model="filter.payload" class="form-control my-1 text-monospace"
                    placeholder="YmE0OGU5YzAyNTk3NTlhYmJmYjU2NDMyZGQ4N2E4MTg=">
            </div>
HTML;
    }

    public function isPass(StreamFilter $filter, RawClick $rawClick)
    {
        try {
            $isValid = $this->checkClick($filter->getPayload(), $rawClick);
            return $filter->getMode() === StreamFilter::ACCEPT xor $isValid;
        } catch (Throwable $e) {
            error_log($e->getMessage());
            return $filter->getMode() === StreamFilter::ACCEPT;
        }
    }

    private function checkClick($payload, RawClick $rawClick)
    {
        $serverRequest = $this->getServerRequest();
        $curl = curl_init(self::CLICK_API_URL);
        curl_setopt_array($curl, [
            CURLOPT_FORBID_REUSE => true,
            CURLOPT_CONNECTTIMEOUT => 5,
            CURLOPT_TIMEOUT => 10,
            CURLOPT_HTTPHEADER => [
                'Accept: text/plain',
                'Content-Type: application/json',
            ],
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => json_encode([
                'cid' => trim((string)$payload),
                'ip' => $rawClick->getIpString(),
                'ua' => $rawClick->getUserAgent(),
                'query' => $serverRequest->getQueryParams(),
                'server' => $serverRequest->getServerParams() + [
                    'HTTP_ACCEPT_LANGUAGE' => $rawClick->getLanguage(),
                    'REMOTE_ADDR' => $rawClick->getIpString(),
                    'HTTP_USER_AGENT' => $rawClick->getUserAgent(),
                ],
            ]),
            CURLOPT_RETURNTRANSFER => true,
        ]);
        $response = curl_exec($curl);
        $code = (int)curl_getinfo($curl, CURLINFO_HTTP_CODE);
        $errno = curl_errno($curl);
        curl_close($curl);
        if ($errno !== 0) {
            throw new RuntimeException('curl: ' . curl_strerror($errno));
        }
        if ($code !== 200) {
            throw new RuntimeException('backend ' . $code);
        }
        return trim((string)$response) === '1';
    }
}