# (c) cavaliba.com - tests / sirene / private page action toolbar

from django.core.cache import cache as cache_django
from django.test import TestCase, override_settings
from django.urls import reverse

import app_home.cache as cache
from tests import helper


class SireneToolbarViews(TestCase):
    def setUp(self):
        cache.clear()
        cache_django.clear()
        self.url = reverse("app_sirene:private")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_frequent_actions_are_first_level_buttons(self):
        helper.add_admin_user(login="unittest")
        response = self.client.get(self.url, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "New (from template)", status_code=200)
        self.assertContains(response, "New (empty message)", status_code=200)
        self.assertContains(response, "View Archive", status_code=200)
        self.assertContains(response, "Edit templates", status_code=200)
        self.assertContains(response, reverse("app_sirene:new_message"), status_code=200)
        self.assertContains(response, reverse("app_sirene:archive"), status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_menu_dropdown_is_rightmost(self):
        helper.add_admin_user(login="unittest")
        response = self.client.get(self.url, follow=True)
        content = response.content.decode()
        first_button = content.find("New (from template)")
        dropdown = content.find('class="btn-group ms-auto"')
        self.assertGreater(first_button, -1)
        self.assertGreater(dropdown, first_button)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_menu_dropdown_still_lists_every_action(self):
        helper.add_admin_user(login="unittest")
        response = self.client.get(self.url, follow=True)
        # the toolbar is a shortcut, not a move: the full menu keeps its entries
        self.assertContains(response, "Anonymous Website", status_code=200)
        self.assertContains(response, "Public Website", status_code=200)
        self.assertContains(response, "Edit public pages", status_code=200)
        self.assertContains(response, "Archive all", status_code=200)
        self.assertContains(response, "Configuration", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_dropdown_labels_match_the_toolbar_labels(self):
        helper.add_admin_user(login="unittest")
        response = self.client.get(self.url, follow=True)
        content = response.content.decode()
        # each promoted action appears twice with the very same wording:
        # once as a toolbar button, once as its dropdown entry
        for label in (
            "New (from template)",
            "New (empty message)",
            "View Archive",
            "Edit templates",
        ):
            self.assertEqual(content.count(label), 2, label)
        # and the pre-toolbar dropdown wording is gone
        self.assertNotIn("New message (empty form)", content)
        self.assertNotIn("Edit Message Templates", content)
        self.assertNotIn("Edit Public Pages templates", content)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_dropdown_buttons_carry_the_dropdown_btn_class(self):
        # both <button> entries used to declare class= twice, so cv-dropdown-btn
        # (which strips the native button chrome) was dropped by the parser
        helper.add_admin_user(login="unittest")
        response = self.client.get(self.url, follow=True)
        content = response.content.decode()
        self.assertEqual(content.count('class="dropdown-item cv-dropdown-btn'), 2)
        self.assertNotIn('class="dropdown-item" data-bs-toggle="modal"', content)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_new_buttons_hidden_without_sirene_new(self):
        helper.add_user_with_perm(login="unittest", perms=["p_sirene_access"])
        response = self.client.get(self.url, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, "New (from template)", status_code=200)
        self.assertNotContains(response, "New (empty message)", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_archive_button_visible_for_plain_user(self):
        # builtin role_default grants p_sirene_history to every authenticated user
        # (builtin/init/012_role.yml), so the Archive shortcut is visible to all -
        # same gate as the dropdown entry it mirrors
        helper.add_user_with_perm(login="unittest", perms=["p_sirene_access"])
        response = self.client.get(self.url, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, reverse("app_sirene:archive"), status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_edit_templates_button_is_not_permission_gated(self):
        # documents the pre-existing gap the dropdown already had (see the
        # "TODO ? permission here for templates edition ?" comment): the shortcut
        # carries no gate either, so it shows for any user reaching the page.
        # The target view still enforces p_data_access + schema read permissions.
        helper.add_user_with_perm(login="unittest", perms=["p_sirene_access"])
        response = self.client.get(self.url, follow=True)
        self.assertContains(response, "Edit templates", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_menu_dropdown_present_for_plain_user(self):
        helper.add_user_with_perm(login="unittest", perms=["p_sirene_access"])
        response = self.client.get(self.url, follow=True)
        self.assertContains(response, 'class="btn-group ms-auto"', status_code=200)
        self.assertContains(response, "Anonymous Website", status_code=200)
