# (c) cavaliba.com - tests / telemetry - raw purge and aggregate retention

from datetime import timedelta

from django.test import TestCase

import app_data.telemetry as T
import app_home.cache as cache
from app_data.models import DataTelemetryAggregate, DataTelemetryRaw
from tests.helper import TELEMETRY_T0, add_telemetry_raw, set_telemetry_config


class TelemetryPurgeTest(TestCase):
    def setUp(self):
        cache.clear()
        T.reset_cache()

    def test_raw_kept_until_hour_aggregated(self):
        set_telemetry_config("TELEMETRY_RAW_KEEP_MINUTES", 1)
        add_telemetry_raw(TELEMETRY_T0 + timedelta(minutes=10), "x.c")
        T.telemetry_aggregate(now=TELEMETRY_T0 + timedelta(minutes=20))

        T.telemetry_aggregate(now=TELEMETRY_T0 + timedelta(minutes=59, seconds=30))

        self.assertEqual(DataTelemetryRaw.objects.count(), 1)

    def test_raw_purged_after_keep_minutes(self):
        add_telemetry_raw(TELEMETRY_T0 + timedelta(minutes=10), "x.c")
        T.telemetry_aggregate(now=TELEMETRY_T0 + timedelta(minutes=20))

        counts = T.telemetry_aggregate(now=TELEMETRY_T0 + timedelta(hours=1, minutes=15))

        self.assertEqual(counts["raw_purge"], 1)
        self.assertEqual(DataTelemetryAggregate.objects.get(period="hour").count, 1)

    def test_raw_hard_cap_without_aggregation(self):
        add_telemetry_raw(TELEMETRY_T0 - timedelta(hours=25), "x.c")
        add_telemetry_raw(TELEMETRY_T0 - timedelta(hours=1), "x.c")

        self.assertEqual(T._purge_raw(TELEMETRY_T0), 1)

    def test_retention_per_period(self):
        for period, days in [("minute", 10), ("hour", 10), ("day", 1000)]:
            DataTelemetryAggregate.objects.create(
                key="x.c", period=period, start=TELEMETRY_T0 - timedelta(days=days), count=1
            )

        count = T.telemetry_purge(now=TELEMETRY_T0)

        self.assertEqual(count, 1)
        self.assertEqual(
            sorted(DataTelemetryAggregate.objects.values_list("period", flat=True)), ["day", "hour"]
        )

    def test_retention_override(self):
        DataTelemetryAggregate.objects.create(
            key="x.c", period="day", start=TELEMETRY_T0 - timedelta(days=1000), count=1
        )

        self.assertEqual(T.telemetry_purge(keep_days={"day": 365}, now=TELEMETRY_T0), 1)
