# (c) cavaliba.com - test / app_cmt common

from datetime import timedelta

from django.test import TestCase
from django.utils import timezone

import app_home.cache as cache
from app_cmt.common import Check, sample_day, sample_hour
from app_cmt.models import CMTDay, CMTHour, CMTRaw


class AppCmtCommonSampleTest(TestCase):
    def setUp(self):
        cache.clear()
        # sample_hour/sample_day only key off Check.keyname (a plain string
        # matched against CMTRaw/CMTHour.checkname) - no real _cmtcheck
        # instance is needed to exercise the roll-up logic itself.
        self.checkname = "11111111-1111-1111-1111-111111111111"
        self.check = Check()
        self.check.keyname = self.checkname

    def _add_raw(self, ago_hours, status):
        obj = CMTRaw.objects.create(checkname=self.checkname, status=status, usec=10)
        CMTRaw.objects.filter(pk=obj.pk).update(
            timestamp=timezone.now() - timedelta(hours=ago_hours)
        )

    def test_sample_hour_counts_ok_and_ko(self):
        # 2 OK + 1 KO, all within the same hour bucket (2h ago)
        self._add_raw(2, True)
        self._add_raw(2, True)
        self._add_raw(2, False)

        total = sample_hour(
            checks=[self.check],
            start_date=timezone.now() - timedelta(hours=3),
            end_date=timezone.now(),
        )
        self.assertGreater(total, 0)

        samples = CMTHour.objects.filter(checkname=self.checkname)
        matched = [s for s in samples if (s.count_ok or 0) + (s.count_ko or 0) > 0]
        self.assertEqual(len(matched), 1)
        self.assertEqual(matched[0].count_ok, 2)
        self.assertEqual(matched[0].count_ko, 1)

    def test_sample_day_aggregates_hours(self):
        now = timezone.now()
        today = now - timedelta(
            hours=now.hour, minutes=now.minute, seconds=now.second, microseconds=now.microsecond
        )

        CMTHour.objects.create(
            checkname=self.checkname,
            count_ok=3,
            count_ko=1,
            timestamp=today + timedelta(hours=2),
        )
        CMTHour.objects.create(
            checkname=self.checkname,
            count_ok=5,
            count_ko=0,
            timestamp=today + timedelta(hours=4),
        )

        sample_day(
            checks=[self.check],
            start_date=today,
            end_date=today + timedelta(hours=23),
        )

        day_sample = CMTDay.objects.get(checkname=self.checkname, timestamp=today)
        self.assertEqual(day_sample.count_ok, 8)
        self.assertEqual(day_sample.count_ko, 1)
