# (c) cavaliba.com - tests / ipam / vlan_view()

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

import app_home.cache as cache
from tests import helper


@override_settings(CAVALIBA_AUTH_MODE="unittest")
class VlanViewTest(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_admin_user(login="unittest")

        helper.add_schema(
            classname="ipam_subnet",
            options={"keyname_mode": "edit"},
            field_definition={
                "description": {"dataformat": "string", "displayname": "Description"},
                "subnet": {
                    "dataformat": "ipv4",
                    "dataformat_ext": "subnet strict",
                    "displayname": "Subnet",
                },
            },
        )
        helper.add_schema(
            classname="ipam_vlan",
            field_definition={
                "description": {"dataformat": "string", "displayname": "Description"},
                "vlan_id": {"dataformat": "int", "displayname": "VLAN ID"},
                "subnet": {
                    "dataformat": "schema",
                    "dataformat_ext": "ipam_subnet",
                    "cardinal_max": 0,
                    "displayname": "Subnet",
                },
            },
        )
        helper.add_instance(
            classname="ipam_subnet",
            keyname="192.0.2.0/28",
            fields={"subnet": "192.0.2.0/28", "description": "test subnet"},
        )
        helper.add_instance(
            classname="ipam_vlan",
            keyname="TESTVLAN",
            fields={"displayname": "Test VLAN", "vlan_id": 10, "subnet": ["192.0.2.0/28"]},
        )

    def test_vlan_view_shows_fields_and_subnet_link(self):
        response = self.client.get(reverse("app_ipam:vlan_view"), {"vlan": "TESTVLAN"})
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Test VLAN")
        self.assertContains(response, "192.0.2.0/28")
        self.assertContains(response, "/data/private/instance/edit/")

    def test_page_title_includes_vlan_and_description(self):
        helper.add_instance(
            classname="ipam_vlan",
            action="update",
            keyname="TESTVLAN",
            fields={"description": "staff vlan"},
        )
        response = self.client.get(reverse("app_ipam:vlan_view"), {"vlan": "TESTVLAN"})
        self.assertContains(response, "IPAM - VLAN - Test VLAN - staff vlan")

    def test_no_search_bar_on_result_page(self):
        response = self.client.get(reverse("app_ipam:vlan_view"), {"vlan": "TESTVLAN"})
        self.assertNotContains(response, 'name="query"')

    def test_unknown_vlan_shows_error(self):
        response = self.client.get(reverse("app_ipam:vlan_view"), {"vlan": "NOPE"})
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "not found")

    def test_shows_detail_button_before_edit_button(self):
        response = self.client.get(reverse("app_ipam:vlan_view"), {"vlan": "TESTVLAN"})
        content = response.content.decode()
        detail_url = "/data/private/instance/detail/"
        edit_url = "/data/private/instance/edit/"
        self.assertIn(detail_url, content)
        self.assertIn(edit_url, content)
        self.assertLess(content.index(detail_url), content.index(edit_url))

    def test_shows_a_custom_field_not_hardcoded_in_the_template(self):
        """Any schema field, not just the ones the old hand-picked stat-strip knew about,
        must show up - proves the field list is generic, not a fixed set."""
        helper.add_schema_field(
            classname="ipam_vlan",
            fields={"notes": {"dataformat": "string", "displayname": "Notes"}},
        )
        helper.add_instance(
            classname="ipam_vlan",
            action="update",
            keyname="TESTVLAN",
            fields={"notes": "custom note about this vlan"},
        )
        response = self.client.get(reverse("app_ipam:vlan_view"), {"vlan": "TESTVLAN"})
        self.assertContains(response, "Notes")
        self.assertContains(response, "custom note about this vlan")
