<?php

/**
 * Matomo - free/libre analytics platform
 *
 * @link    https://matomo.org
 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
 */

namespace Piwik\Plugins\Actions;

use Piwik\Columns\Dimension;
use Piwik\Site;
use Piwik\Plugin\ViewDataTable;
use Piwik\Tracker\Action;

/**
 * Actions plugin
 *
 * Reports about the page views, the outlinks and downloads.
 *
 */
class Actions extends \Piwik\Plugin
{
    public const ACTIONS_REPORT_ROWS_DISPLAY = 100;

    /**
     * @see \Piwik\Plugin::registerEvents
     */
    public function registerEvents()
    {
        return array(
            'ViewDataTable.configure'         => 'configureViewDataTable',
            'AssetManager.getJavaScriptFiles' => 'getJsFiles',
            'Insights.addReportToOverview'    => 'addReportToInsightsOverview',
            'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations',
            'Metrics.getDefaultMetricSemanticTypes' => 'addMetricSemanticTypes',
            'Metrics.getDefaultMetricDocumentationTranslations' => 'addMetricDocumentationTranslations',
            'Actions.addActionTypes' => 'addActionTypes',
        );
    }

    public function addMetricSemanticTypes(array &$types): void
    {
        $metrics = array(
            'nb_pageviews'        => Dimension::TYPE_NUMBER,
            'nb_uniq_pageviews'   => Dimension::TYPE_NUMBER,
            'nb_downloads'        => Dimension::TYPE_NUMBER,
            'nb_uniq_downloads'   => Dimension::TYPE_NUMBER,
            'nb_outlinks'         => Dimension::TYPE_NUMBER,
            'nb_uniq_outlinks'    => Dimension::TYPE_NUMBER,
            'nb_searches'         => Dimension::TYPE_NUMBER,
            'nb_keywords'         => Dimension::TYPE_NUMBER,
            'entry_nb_visits'      => Dimension::TYPE_NUMBER,
            'entry_bounce_count'   => Dimension::TYPE_NUMBER,
            'exit_nb_visits'       => Dimension::TYPE_NUMBER,
            'nb_pages_per_search'      => Dimension::TYPE_NUMBER,
            'nb_hits_following_search' => Dimension::TYPE_NUMBER,
        );

        $types = array_merge($types, $metrics);
    }

    public function addMetricTranslations(&$translations)
    {
        $metrics = array(
            'nb_pageviews'        => 'General_ColumnPageviews',
            'nb_uniq_pageviews'   => 'General_ColumnUniquePageviews',
            'nb_downloads'        => 'General_Downloads',
            'nb_uniq_downloads'   => 'Actions_ColumnUniqueDownloads',
            'nb_outlinks'         => 'General_Outlinks',
            'nb_uniq_outlinks'    => 'Actions_ColumnUniqueOutlinks',
            'nb_searches'         => 'Actions_ColumnSearches',
            'nb_keywords'         => 'Actions_ColumnSiteSearchKeywords',
            'avg_time_generation' => 'General_ColumnAverageGenerationTime',
            'exit_rate'            => 'General_ColumnExitRate',
            'entry_nb_visits'      => 'General_ColumnEntrances',
            'entry_bounce_count'   => 'General_ColumnBounces',
            'exit_nb_visits'       => 'General_ColumnExits',
            'nb_pages_per_search'      => 'Actions_ColumnPagesPerSearch',
            'nb_hits_following_search' => 'General_ColumnViewedAfterSearch',
        );

        $translations = array_merge($translations, $metrics);
    }

    public function addMetricDocumentationTranslations(&$translations)
    {
        $metrics = array(
            'nb_pageviews'        => 'General_ColumnPageviewsDocumentation',
            'nb_uniq_pageviews'   => 'General_ColumnUniquePageviewsDocumentation',
            'nb_downloads'        => 'Actions_ColumnClicksDocumentation',
            'nb_uniq_downloads'   => 'Actions_ColumnUniqueClicksDocumentation',
            'nb_outlinks'         => 'Actions_ColumnClicksDocumentation',
            'nb_uniq_outlinks'    => 'Actions_ColumnUniqueClicksDocumentation',
            'nb_searches'         => 'Actions_ColumnSearchesDocumentation',
            'avg_time_generation' => 'General_ColumnAverageGenerationTimeDocumentation',
            'entry_nb_visits'     => 'General_ColumnEntrancesDocumentation',
            'entry_bounce_count'  => 'General_ColumnBouncesDocumentation',
            'exit_nb_visits'      => 'General_ColumnExitsDocumentation',
            'exit_rate'           => 'General_ColumnExitRateDocumentation',
        );

        $translations = array_merge($translations, $metrics);
    }

    public function addReportToInsightsOverview(&$reports)
    {
        $reports['Actions_getPageUrls']   = array();
        $reports['Actions_getPageTitles'] = array();
        $reports['Actions_getDownloads']  = array('flat' => 1);
    }

    public function getJsFiles(&$jsFiles)
    {
        $jsFiles[] = "plugins/Actions/javascripts/actionsDataTable.js";
        $jsFiles[] = "plugins/Actions/javascripts/rowactions.js";
    }

    public function addActionTypes(&$types)
    {
        $types[] = [
            'id' => Action::TYPE_PAGE_URL,
            'name' => 'pageviews',
        ];
        $types[] = [
            'id' => Action::TYPE_CONTENT,
            'name' => 'contents',
        ];
        $types[] = [
            'id' => Action::TYPE_SITE_SEARCH,
            'name' => 'sitesearches',
        ];
        $types[] = [
            'id' => Action::TYPE_EVENT,
            'name' => 'events',
        ];
        $types[] = [
            'id' => Action::TYPE_OUTLINK,
            'name' => 'outlinks',
        ];
        $types[] = [
            'id' => Action::TYPE_DOWNLOAD,
            'name' => 'downloads',
        ];
    }

    public function isSiteSearchEnabled($idSites, $idSite)
    {
        $idSites = Site::getIdSitesFromIdSitesString($idSites, true);

        if (!empty($idSite)) {
            $idSites[] = $idSite;
        }

        if (empty($idSites)) {
            return false;
        }

        foreach ($idSites as $idSite) {
            if (!Site::isSiteSearchEnabledFor($idSite)) {
                return false;
            }
        }

        return true;
    }


    public function configureViewDataTable(ViewDataTable $view)
    {
        if ($this->pluginName == $view->requestConfig->getApiModuleToRequest()) {
            if ($view->isRequestingSingleDataTable()) {
                // make sure custom visualizations are shown on actions reports
                $view->config->show_all_views_icons = true;
                $view->config->show_bar_chart = false;
                $view->config->show_pie_chart = false;
                $view->config->show_tag_cloud = false;
            }
        }
    }

    /**
     * @param \Piwik\DataTable $dataTable
     * @param int $level
     */
    public static function setDataTableRowLevels($dataTable, $level = 0)
    {
        foreach ($dataTable->getRows() as $row) {
            $row->setMetadata('css_class', 'level' . $level);

            $subtable = $row->getSubtable();
            if ($subtable) {
                self::setDataTableRowLevels($subtable, $level + 1);
            }
        }
    }
}
