# (c) cavaliba.com - test / schema / hide_from_related option

from django.core.cache import cache as cache_django
from django.test import TestCase

import app_home.cache as cache
from app_data.data import Instance
from app_data.keyname import rename
from app_data.models import DataEAV
from app_data.related import get_related
from tests import helper

ADMIN_AAA = {"perms": ["p_data_admin"]}


class HideFromRelatedTest(TestCase):
    def setUp(self):
        """tschema_hidden (hide_from_related: true) and tschema_visible each
        reference a tschema_target instance through a "schema" field."""
        cache.clear()
        cache_django.clear()

        helper.add_schema("tschema_target", displayname="Target Schema")
        helper.add_schema(
            "tschema_hidden", displayname="Hidden Referrer",
            options={"hide_from_related": True},
            field_definition={
                "ref": {"dataformat": "schema", "dataformat_ext": "tschema_target"}
            },
        )  # fmt: skip
        helper.add_schema(
            "tschema_visible", displayname="Visible Referrer",
            field_definition={
                "ref": {"dataformat": "schema", "dataformat_ext": "tschema_target"}
            },
        )  # fmt: skip

        helper.add_instance("tschema_target", "target1")
        helper.add_instance("tschema_hidden", "hidden1", fields={"ref": "target1"})
        helper.add_instance("tschema_visible", "visible1", fields={"ref": "target1"})

    def test_schema_option_default_false(self):
        schema = helper.add_schema("tschema_plain", displayname="Plain Schema")
        self.assertFalse(schema.hide_from_related)

    def test_instance_related_excludes_hidden_schema(self):
        target = Instance.from_keyname(classname="tschema_target", keyname="target1")
        related = target.related(aaa=ADMIN_AAA)
        self.assertNotIn("tschema_hidden", related)

    def test_instance_related_still_includes_visible_schema(self):
        target = Instance.from_keyname(classname="tschema_target", keyname="target1")
        related = target.related(aaa=ADMIN_AAA)
        self.assertIn("tschema_visible", related)
        self.assertEqual(related["tschema_visible"]["count"], 1)

    def test_get_related_query_layer_still_includes_hidden_schema(self):
        """build_related_reply()/get_related() stay unfiltered - only the
        display-facing Instance.related() drops hide_from_related schemas -
        so callers like rename() still see every real referrer."""
        related = get_related(classname="tschema_target", keyname="target1", aaa=ADMIN_AAA)
        self.assertIn("tschema_hidden", related)
        self.assertEqual(related["tschema_hidden"]["count"], 1)

    def test_rename_still_updates_references_in_hidden_schema(self):
        result = rename(
            classname="tschema_target", oldkeyname="target1", newkeyname="target2", dryrun=False
        )
        self.assertEqual(result["errors"], [])
        self.assertTrue(
            DataEAV.objects.filter(
                classname="tschema_hidden", keyname="hidden1", fieldname="ref", value="target2"
            ).exists()
        )
