# (c) cavaliba.com - tests / dataview / datetime cell second precision

from datetime import datetime

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

import app_home.cache as cache
from app_data.data import Instance
from app_data.dataview import DataView
from app_data.models import DataInstance
from tests import helper

SCHEMA = "dvprec"

ISO_SECONDS_RE = r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}$"


class TestDataViewDatetimeSecondPrecision(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_schema(
            classname=SCHEMA,
            field_definition={"mystring": {"dataformat": "string", "displayname": "MyString"}},
        )
        helper.add_instance(
            classname="_dataview",
            keyname="dvprec_view",
            fields={
                "target_class": SCHEMA,
                "content": (
                    "columns:\n  - keyname\n  - last_update\n  - Synced:\n      from: last_sync\n"
                ),
            },
        )
        helper.add_instance(classname=SCHEMA, keyname="obj01", fields={"mystring": "v1"})

        DataInstance.objects.filter(classname=SCHEMA, keyname="obj01").update(
            last_sync=timezone.make_aware(datetime(2026, 2, 15, 10, 11, 12, 123456)),
            last_update=timezone.make_aware(datetime(2026, 2, 15, 10, 11, 13, 654321)),
        )
        self.instance = Instance.from_keyname(SCHEMA, "obj01")

    def test_value_and_csv_modes_have_no_fractional_seconds(self):
        dataview = DataView(keyname="dvprec_view")
        for mode in ("value", "csv"):
            values = dataview.filter(instance=self.instance, mode=mode)
            # value/csv mode prepends classname: classname, keyname, last_update, Synced
            for cell in (values[2], values[3]):
                self.assertRegex(cell, ISO_SECONDS_RE)
                self.assertNotIn(".", cell)

    def test_datapoint_mode_unchanged(self):
        dataview = DataView(keyname="dvprec_view")
        values = dataview.filter(instance=self.instance, mode="datapoint")
        # keyname, last_update, Synced (from: last_sync) - local time, no 'T', no offset
        for cell in (values[1], values[2]):
            self.assertRegex(cell, r"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$")
