"""FT spec for admin-Post (kind=NOTE_UNLOCK) readonly input.

Bug A: a Note-unlock Post is system-authored and shouldn't accept user
responses. The post.html input field gets a "No response needed at this
time" placeholder + the readonly attribute, AND the server-side view_post
POST handler hard-rejects writes (defense-in-depth alongside the
post_save listener that nukes any errant Line that sneaks in).

Run:
    python src/manage.py test functional_tests.test_admin_post_readonly
"""
from django.utils import timezone
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

from apps.billboard.models import Line, Post
from apps.drama.models import Note
from apps.lyric.models import User

from .base import FunctionalTest


class AdminPostInputReadonlyTest(FunctionalTest):
    """The note-unlock Post's input is readonly + carries a 'No response
    needed' placeholder. User-Post inputs stay untouched."""

    def setUp(self):
        super().setUp()
        self.gamer = User.objects.create(email="reader@test.io")
        # Note.grant_if_new auto-creates the Notes & recognitions Post.
        Note.grant_if_new(self.gamer, "stargazer")
        self.admin_post = Post.objects.get(
            owner=self.gamer, kind=Post.KIND_NOTE_UNLOCK,
        )
        self.create_pre_authenticated_session("reader@test.io")

    def test_admin_post_input_is_readonly(self):
        self.browser.get(
            self.live_server_url + f"/billboard/post/{self.admin_post.id}/"
        )
        inp = self.wait_for(
            lambda: self.browser.find_element(By.ID, "id_post_line_text")
        )
        self.assertTrue(
            inp.get_attribute("readonly"),
            "Admin-Post input should carry readonly attribute",
        )

    def test_admin_post_input_has_no_response_placeholder(self):
        self.browser.get(
            self.live_server_url + f"/billboard/post/{self.admin_post.id}/"
        )
        inp = self.wait_for(
            lambda: self.browser.find_element(By.ID, "id_post_line_text")
        )
        self.assertEqual(
            inp.get_attribute("placeholder"),
            "No response needed at this time",
        )


class AdminPostHasNoBudBtnTest(FunctionalTest):
    """Admin-Post (note-unlock thread) suppresses #id_bud_btn — friend
    invites don't apply to system-authored threads. User-Post still
    renders the btn (regression coverage in test_core_bud_btn.py)."""

    def setUp(self):
        super().setUp()
        self.gamer = User.objects.create(email="nobud@test.io")
        Note.grant_if_new(self.gamer, "stargazer")
        self.admin_post = Post.objects.get(
            owner=self.gamer, kind=Post.KIND_NOTE_UNLOCK,
        )
        self.create_pre_authenticated_session("nobud@test.io")

    def test_bud_btn_absent_on_admin_post(self):
        self.browser.get(
            self.live_server_url + f"/billboard/post/{self.admin_post.id}/"
        )
        # Wait for page to settle — readonly input is the marker.
        self.wait_for(
            lambda: self.browser.find_element(By.ID, "id_post_line_text")
        )
        self.assertFalse(
            self.browser.find_elements(By.ID, "id_bud_btn"),
            "Admin-Post must NOT render #id_bud_btn",
        )


class UserPostInputUnaffectedTest(FunctionalTest):
    """Regression: user-Post input keeps the regular composer affordances."""

    def setUp(self):
        super().setUp()
        self.gamer = User.objects.create(email="composer@test.io")
        self.user_post = Post.objects.create(
            owner=self.gamer, kind=Post.KIND_USER_POST, title="hello",
        )
        Line.objects.create(
            post=self.user_post, text="hello", author=self.gamer,
        )
        self.create_pre_authenticated_session("composer@test.io")

    def test_user_post_input_is_not_readonly(self):
        self.browser.get(
            self.live_server_url + f"/billboard/post/{self.user_post.id}/"
        )
        inp = self.wait_for(
            lambda: self.browser.find_element(By.ID, "id_post_line_text")
        )
        self.assertFalse(
            inp.get_attribute("readonly"),
            "User-Post input must NOT be readonly",
        )
        self.assertEqual(
            inp.get_attribute("placeholder"),
            "Enter a post line",
        )
