
<center><h2><strong>Ubuntu</strong></h2>
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
<?php

/**
 * Matomo - free/libre analytics platform
 *
 * @link    https://matomo.org
 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
 */
declare (strict_types=1);
namespace Piwik\Plugins\BotTracking;

use Piwik\DataTable\Renderer\Json;
use Piwik\Piwik;
use Piwik\Plugins\BotTracking\BotTrackingMethod\BotTrackingMethodAbstract;
use Piwik\Plugins\BotTracking\Reports\SegmentNotSupportedMessageHelper;
use Piwik\Plugin\Menu;
use Piwik\Plugin\Manager;
use Piwik\Request;
use Piwik\SiteContentDetector;
use Piwik\Url;
class Controller extends \Piwik\Plugin\Controller
{
    public function siteWithoutData() : string
    {
        $this->checkSitePermission();
        $request = Request::fromRequest();
        $period = $request->getStringParameter('period', '');
        $date = $request->getStringParameter('date', '');
        return $this->renderTemplateAs('siteWithoutData', ['backToMatomoLink' => $this->buildAIBotsOverviewUrl($period, $date), 'hideWhatIsNew' => \true], $viewType = 'basic');
    }
    public function getTrackingMethodsForSite() : string
    {
        $this->checkSitePermission();
        $siteContentDetector = $this->buildSiteContentDetector();
        $trackingMethodClasses = $this->getBotTrackingMethods();
        $detectContent = [];
        foreach ($trackingMethodClasses as $trackingMethodClass) {
            $contentDetectionId = $trackingMethodClass::getSiteContentDetectionId();
            if ($contentDetectionId !== null && $contentDetectionId !== '') {
                $detectContent[] = $contentDetectionId;
            }
        }
        $siteContentDetector->detectContent($detectContent, $this->idSite);
        $trackingMethods = [];
        foreach ($trackingMethodClasses as $trackingMethodClass) {
            $contentDetectionId = $trackingMethodClass::getSiteContentDetectionId();
            $contentDetectionClass = null;
            $wasDetected = \false;
            if (!empty($contentDetectionId)) {
                $contentDetectionClass = $siteContentDetector->getSiteContentDetectionById($contentDetectionId);
                if (null === $contentDetectionClass) {
                    continue;
                }
                $wasDetected = $siteContentDetector->wasDetected($contentDetectionId);
            }
            $tabContent = $trackingMethodClass::renderInstructionsTab();
            $link = $trackingMethodClass::getLink();
            $icon = $trackingMethodClass::getIcon();
            if (!empty($tabContent) || !empty($link)) {
                if (empty($icon) && $contentDetectionClass) {
                    $icon = $contentDetectionClass->getIcon();
                }
                $trackingMethods[] = ['id' => $trackingMethodClass::getId(), 'name' => $trackingMethodClass::getName(), 'content' => $tabContent, 'icon' => $icon ?? '', 'isOthers' => $trackingMethodClass::isOthers(), 'priority' => $trackingMethodClass::getPriority(), 'wasDetected' => $wasDetected, 'link' => $link];
            }
        }
        usort($trackingMethods, function ($a, $b) {
            if ($a['wasDetected'] === $b['wasDetected']) {
                return $a['priority'] === $b['priority'] ? 0 : ($a['priority'] < $b['priority'] ? -1 : 1);
            }
            return $a['wasDetected'] ? -1 : 1;
        });
        Json::sendHeaderJSON();
        return json_encode(['trackingMethods' => $trackingMethods]);
    }
    public function getEvolutionGraph() : ?string
    {
        $this->checkSitePermission();
        $columns = [];
        $columnsFromRequest = Request::fromRequest()->getParameter('columns', '');
        if (!empty($columnsFromRequest) && (is_array($columnsFromRequest) || is_string($columnsFromRequest))) {
            $columns = Piwik::getArrayFromApiParameter($columnsFromRequest);
        }
        $documentation = Piwik::translate('BotTracking_ChatbotsOverTimeReportDocumentation') . '<br /><br />';
        $translations = \Piwik\Plugins\BotTracking\Metrics::getMetricTranslations();
        $docs = \Piwik\Plugins\BotTracking\Metrics::getMetricDocumentation();
        foreach (\Piwik\Plugins\BotTracking\Metrics::getSparklineMetricOrder() as $metric) {
            if (empty($translations[$metric]) || empty($docs[$metric])) {
                continue;
            }
            $documentation .= sprintf('<b>%s:</b> %s<br />', $translations[$metric], $docs[$metric]);
        }
        $metrics = \Piwik\Plugins\BotTracking\Metrics::getSparklineMetricOrder();
        if (Request::fromRequest()->getStringParameter('period', '') !== 'day') {
            $metrics = array_filter($metrics, function ($metric) {
                return !in_array($metric, [\Piwik\Plugins\BotTracking\Metrics::METRIC_AI_CHATBOTS_UNIQUE_DOCUMENT_URLS, \Piwik\Plugins\BotTracking\Metrics::METRIC_AI_CHATBOTS_UNIQUE_PAGE_URLS]);
            });
        }
        $view = $this->getLastUnitGraphAcrossPlugins($this->pluginName, __FUNCTION__, $columns, $metrics, $documentation, 'BotTracking.get');
        if (empty($view->config->columns_to_display)) {
            $view->config->columns_to_display = [\Piwik\Plugins\BotTracking\Metrics::METRIC_AI_CHATBOTS_REQUESTS];
        }
        SegmentNotSupportedMessageHelper::addSegmentNotSupportedMessage($view);
        return $this->renderView($view);
    }
    public function noRecentRequestsMessage() : string
    {
        $this->checkSitePermission();
        $request = Request::fromRequest();
        $period = $request->getStringParameter('period', '');
        $date = $request->getStringParameter('date', '');
        $noDataParams = ['module' => 'BotTracking', 'action' => 'siteWithoutData', 'idSite' => $this->idSite];
        if ($period !== '') {
            $noDataParams['period'] = $period;
        }
        if ($date !== '') {
            $noDataParams['date'] = $date;
        }
        $noDataUrl = 'index.php?' . Url::getQueryStringFromParameters($noDataParams);
        return $this->renderTemplate('noRecentRequestsMessage', ['noDataUrl' => $noDataUrl]);
    }
    public function showNoRecentRequestsMessage() : string
    {
        $this->checkSitePermission();
        $request = Request::fromRequest();
        $period = $request->getStringParameter('period', '');
        $date = $request->getStringParameter('date', '');
        Json::sendHeaderJSON();
        return json_encode(\Piwik\Plugins\BotTracking\NoRecentRequestsMessage::shouldShow($this->idSite, $period, $date));
    }
    /**
     * @return array<class-string<BotTrackingMethodAbstract>>
     */
    protected function getBotTrackingMethods() : array
    {
        return Manager::getInstance()->findMultipleComponents('BotTrackingMethod', BotTrackingMethodAbstract::class);
    }
    protected function buildSiteContentDetector() : SiteContentDetector
    {
        return new SiteContentDetector();
    }
    protected function buildAIBotsOverviewUrl(string $period, string $date) : string
    {
        $menu = new Menu();
        $params = $menu->urlForDefaultUserParams($this->idSite);
        $params['module'] = 'CoreHome';
        $params['action'] = 'index';
        if ($period !== '') {
            $params['period'] = $period;
        }
        if ($date !== '') {
            $params['date'] = $date;
        }
        $hashParams = $params;
        $hashParams['category'] = 'General_AIAssistants';
        $hashParams['subcategory'] = 'BotTracking_AIChatbotsOverview';
        return 'index.php?' . Url::getQueryStringFromParameters($params) . '#?' . Url::getQueryStringFromParameters($hashParams);
    }
}
