"""The Owners-page refinements from rian's testing pass."""
from django.contrib.auth import get_user_model
from django.core import mail
from django.test import TestCase, override_settings
from django.urls import reverse

User = get_user_model()


@override_settings(SITE_NAME="The Shore Club Owners")
class PeoplePolishTests(TestCase):
    def setUp(self):
        self.staff = User.objects.create_user("staff", password="pw-staff-12345", is_staff=True)
        self.owner = User.objects.create_user(
            "owner", email="owner@example.com", password="pw-owner-12345")
        self.client.force_login(self.staff)

    # ---- the invite email ----
    def test_a_new_owner_gets_an_invitation_not_a_reset(self):
        self.client.post(reverse("backoffice:person_add"), {
            "first_name": "Joan", "last_name": "Hagan",
            "email": "joan@example.com", "method": "email",
        }, secure=True)
        self.assertEqual(len(mail.outbox), 1)
        message = mail.outbox[0]
        self.assertEqual(message.subject, "You have been invited to The Shore Club Owners")
        self.assertIn("You've been invited to The Shore Club Owners.", message.body)
        self.assertIn("Click here to set your password:", message.body)
        self.assertIn("/accounts/reset/", message.body)
        self.assertIn("Your username is: joan", message.body)
        self.assertNotIn("Someone asked to reset", message.body)
        self.assertNotIn("&#", message.body)

    def test_the_reset_email_is_unchanged(self):
        self.client.post(reverse("backoffice:person_reset_link", args=[self.owner.pk]),
                         secure=True)
        message = mail.outbox[0]
        self.assertEqual(message.subject, "Reset your password")
        self.assertIn("Someone asked to reset", message.body)

    # ---- new password stays where you are ----
    def test_generate_password_answers_fetch_with_json(self):
        response = self.client.post(
            reverse("backoffice:person_new_password", args=[self.owner.pk]),
            secure=True, HTTP_X_REQUESTED_WITH="XMLHttpRequest")
        data = response.json()
        self.assertEqual(data["username"], "owner")
        self.owner.refresh_from_db()
        self.assertTrue(self.owner.check_password(data["password"]))

    def test_plain_post_still_redirects_for_no_script(self):
        response = self.client.post(
            reverse("backoffice:person_new_password", args=[self.owner.pk]), secure=True)
        self.assertEqual(response.status_code, 302)

    # ---- the add box only reopens on error ----
    def test_adding_successfully_leaves_the_add_box_collapsed(self):
        response = self.client.post(reverse("backoffice:person_add"), {
            "email": "new@example.com", "method": "email",
        }, secure=True, follow=True)
        self.assertNotIn('class="folder add-person" open',
                         response.content.decode())

    def test_an_add_error_reopens_the_box(self):
        response = self.client.post(reverse("backoffice:person_add"), {
            "email": "owner@example.com", "method": "email",   # duplicate
        }, secure=True, follow=True)
        self.assertIn("?add=1", response.redirect_chain[-1][0])
        self.assertIn('class="folder add-person" open', response.content.decode())

    # ---- wording and the live filter ----
    def test_the_new_button_wording(self):
        body = self.client.get(reverse("backoffice:people"), secure=True).content.decode()
        self.assertIn("Email a password reset", body)
        self.assertIn("Generate new password", body)
        self.assertNotIn(">Send link<", body)
        self.assertNotIn(">New password<", body)

    def test_rows_carry_a_search_string_for_the_live_filter(self):
        body = self.client.get(reverse("backoffice:people"), secure=True).content.decode()
        self.assertIn('data-search="', body)
        self.assertIn('id="people-filter"', body)
        self.assertIn('id="pw-dialog"', body)


    def test_staff_surfaces_carry_the_staff_only_flag(self):
        body = self.client.get(reverse("backoffice:people"), secure=True).content.decode()
        self.assertIn("staff-flag", body)
        library = self.client.get(reverse("documents:library"), secure=True).content.decode()
        self.assertIn("staff-flag", library)     # the uploader
        self.assertIn("nav-staff", library)      # the masthead section label
        board = self.client.get(reverse("documents:board"), secure=True).content.decode()
        self.assertIn("staff-flag", board)       # the board tools

    def test_owners_never_see_a_staff_flag(self):
        self.client.force_login(self.owner)
        for name in ("documents:library", "documents:board"):
            body = self.client.get(reverse(name), secure=True).content.decode()
            self.assertNotIn("staff-flag", body, name)
            self.assertNotIn("nav-staff", body, name)
