# (c) cavaliba.com - tests / telemetry - UI views: index, dashboard, widget snippet

from datetime import timedelta

from django.test import TestCase, override_settings
from django.urls import reverse
from django.utils import timezone

import app_data.telemetry as T
import app_home.cache as cache
from tests import helper


@override_settings(CAVALIBA_AUTH_MODE="unittest")
class TelemetryViewTest(TestCase):
    def setUp(self):
        cache.clear()
        T.reset_cache()
        helper.add_admin_user(login="unittest")
        now = timezone.now()
        helper.add_telemetry_raw(now - timedelta(minutes=10), "auth.login", id="oidc")
        for svalue in ["ok", "ok", "ko"]:
            helper.add_telemetry_raw(now - timedelta(minutes=10), "x.s", "set", svalue=svalue)
        T.telemetry_aggregate(now=now)

    def _widget(self, query):
        return self.client.get(reverse("telemetry:widget") + "?" + query)

    @override_settings(CAVALIBA_AUTH_MODE="local")
    def test_unauthenticated_redirects(self):
        self.client.logout()
        self.assertEqual(self.client.get(reverse("telemetry:index")).status_code, 302)
        self.assertEqual(self._widget("name=logins_hourly").content, b"")

    def test_index(self):
        response = self.client.get(reverse("telemetry:index"))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "auth.login")
        self.assertContains(response, reverse("telemetry:dashboard", args=["security"]))

    def test_index_with_key_renders_widget_cells(self):
        response = self.client.get(
            reverse("telemetry:index") + "?key=auth.login&period=minute&start=now-1h"
        )
        self.assertEqual(response.status_code, 200)
        # barchart + table, plus the per-id breakdown since auth.login has ids
        self.assertContains(response, 'hx-get="/telemetry/widget/?', count=3)
        self.assertContains(response, "w=idtable")
        self.assertContains(response, "oidc")

    def test_dashboard(self):
        response = self.client.get(reverse("telemetry:dashboard", args=["security"]))
        self.assertEqual(response.status_code, 200)
        self.assertContains(
            response, "cv-telemetry-cell ", count=len(T.DASHBOARDS["security"]["widgets"])
        )

    def test_unknown_dashboard_redirects(self):
        response = self.client.get(reverse("telemetry:dashboard", args=["nope"]))
        self.assertRedirects(response, reverse("telemetry:index"))

    def test_widget_value(self):
        response = self._widget("name=users_today")
        self.assertContains(response, "cv-telemetry-value")

    def test_widget_barchart(self):
        response = self._widget("w=barchart&key=auth.login&period=minute&start=now-1h")
        self.assertContains(response, "data-chart=")
        self.assertContains(response, '"values"')

    def test_widget_table_breakdown_summed(self):
        response = self._widget("w=table&key=x.s&period=minute&start=now-1h")
        self.assertContains(response, '<td>ok</td><td class="text-end">2</td>', html=False)

    def test_widget_errors_inline(self):
        for query, error in [
            ("w=value&key=no.key", "unknown key"),
            ("name=nope", "unknown widget"),
            ("w=pie&key=auth.login", "invalid widget"),
            ("w=barchart&key=auth.login&period=minute&start=now-1w", "use a larger period"),
        ]:
            response = self._widget(query)
            self.assertEqual(response.status_code, 200)
            self.assertContains(response, error)
