<!--
  Matomo - free/libre analytics platform

  @link    https://matomo.org
  @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
-->

<template>
  <tr :class="{
    sitesTableGroup: !!site.isGroup,
    sitesTableGroupSite: !site.isGroup && !!site.group,
    sitesTableSite: !site.isGroup && !site.group,
  }">
    <td class="label">
      <template v-if="!site.isGroup">
        <a
            rel="noreferrer noopener"
            target="_blank"
            :href="site.main_url"
            :title="translate('General_GoTo', htmlEntities(site.main_url))"
        >
          <span class="icon icon-outlink" /></a>
        <a
            title="View reports"
            class="value"
            :href="dashboardUrl"
        >
          {{ siteLabel }}
        </a>
      </template>
      <template v-else>
        <span class="value">{{ siteLabel }}</span>
      </template>
    </td>

    <td><span class="value">{{ formatNumber(site.nb_visits) }}</span></td>
    <td><span class="value">{{ formatNumber(site.nb_pageviews) }}</span></td>
    <td v-if="showAiChatbotsRequests">
      <span class="value">{{ formatNumber(site.ai_chatbots_requests) }}</span>
    </td>
    <td><span class="value">{{ formatNumber(site.hits) }}</span></td>
    <td v-if="displayRevenue">
      <span class="value">{{ formatCurrency(site.revenue, site.currencySymbol || '') }}</span>
    </td>

    <td :colspan="displaySparkline ? 1 : 2">
      <template v-if="!site.isGroup && sparklineMetric in site">
        <img :src="evolutionIconSrc" alt="" />
        <span :class="evolutionTrendClass">
          {{ calculateAndFormatEvolution(
                site[sparklineMetric], site[`previous_${sparklineMetric}`] * site.ratio, true
             ) }}
        </span>
      </template>
    </td>

    <td v-if="displaySparkline"
        class="sitesTableSparkline"
    >
      <a
          rel="noreferrer noopener"
          target="_blank"
          :href="dashboardUrl"
          :title="translate(
            'General_GoTo',
            translate('Dashboard_DashboardOf', htmlEntities(siteLabel)),
          )"
          v-if="!site.isGroup"
      >
        <img
            alt=""
            width="100"
            height="25"
            :src="evolutionSparklineSrc"
        />
      </a>
    </td>
  </tr>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import {
  Matomo,
  MatomoUrl,
  Range,
  format,
} from 'CoreHome';

import { DashboardSiteData, DashboardMetrics, EvolutionTrend } from '../types';

export default defineComponent({
  props: {
    displayRevenue: {
      type: Boolean,
      required: true,
    },
    evolutionMetric: {
      type: String,
      required: true,
    },
    modelValue: {
      type: Object,
      required: true,
    },
    sparklineMetric: String,
    displaySparkline: Boolean,
    showAiChatbotsRequests: {
      type: Boolean,
      required: true,
    },
  },
  computed: {
    dashboardUrl() {
      const dashboardParams = MatomoUrl.stringify({
        module: 'CoreHome',
        action: 'index',
        date: Matomo.currentDateString,
        period: Matomo.period,
        idSite: this.site.idsite,
      });

      return `?${dashboardParams}${this.tokenParam}`;
    },
    evolutionIconSrc() {
      if (this.evolutionTrend === 1) {
        return 'plugins/MultiSites/images/arrow_up.svg';
      }

      if (this.evolutionTrend === -1) {
        return 'plugins/MultiSites/images/arrow_down.svg';
      }

      return 'plugins/MultiSites/images/stop.svg';
    },
    evolutionSparklineSrc() {
      let sparklineDate = Matomo.currentDateString as string;

      if (Matomo.period as string !== 'range') {
        const { startDate, endDate } = Range.getLastNRange(
          Matomo.period as string,
          '30',
          Matomo.currentDateString as string,
        );

        sparklineDate = `${format(startDate)},${format(endDate)}`;
      }

      const sparklineParams = MatomoUrl.stringify({
        module: 'MultiSites',
        action: 'getEvolutionGraph',
        date: sparklineDate,
        period: Matomo.period as string,
        idSite: this.site.idsite,
        columns: this.sparklineMetric,
        evolutionBy: this.sparklineMetric,
        colors: JSON.stringify(Matomo.getSparklineColors()),
        viewDataTable: 'sparkline',
        // The render size is twice the display size (the img is shown at 100x25) so the
        // PNG renders at 2x pixel density.
        width: 200,
        height: 50,
      });

      return `?${sparklineParams}${this.tokenParam}`;
    },
    evolutionTrend(): EvolutionTrend {
      const property = `${this.evolutionMetric}_trend` as keyof DashboardMetrics;

      return this.site[property] as EvolutionTrend;
    },
    evolutionTrendClass(): string {
      if (this.evolutionTrend === 1) {
        return 'evolutionTrendPositive';
      }

      if (this.evolutionTrend === -1) {
        return 'evolutionTrendNegative';
      }

      return '';
    },
    site(): DashboardSiteData {
      return this.modelValue as DashboardSiteData;
    },
    siteLabel() {
      return Matomo.helper.htmlDecode(this.site.label);
    },
    tokenParam() {
      const token_auth = MatomoUrl.urlParsed.value.token_auth as string;

      return token_auth ? `&token_auth=${token_auth}` : '';
    },
  },
  methods: {
    htmlEntities(value: string) {
      return Matomo.helper.htmlEntities(value);
    },
  },
});
</script>
