"""
Tests for UX component templates.

These tests verify that component templates render correctly
with various parameter combinations.
"""

import pytest
from django.template import Context, Template


@pytest.mark.django_db
class TestPageHeaderComponent:
    """Tests for page_header.html component."""

    def test_renders_title(self):
        """Should render title text."""
        template = Template(
            """
            {% include 'components/layout/page_header.html' with title='Test Title' %}
            """
        )
        html = template.render(Context({}))

        assert "Test Title" in html

    def test_renders_subtitle(self):
        """Should render subtitle when provided."""
        template = Template(
            """
            {% include 'components/layout/page_header.html' with
                title='Title'
                subtitle='Subtitle text'
            %}
            """
        )
        html = template.render(Context({}))

        assert "Subtitle text" in html

    def test_renders_icon(self):
        """Should render icon when provided."""
        template = Template(
            """
            {% include 'components/layout/page_header.html' with
                title='Title'
                icon='fas fa-star'
            %}
            """
        )
        html = template.render(Context({}))

        assert "fas fa-star" in html

    def test_renders_primary_action(self):
        """Should render primary action button."""
        template = Template(
            """
            {% include 'components/layout/page_header.html' with
                title='Title'
                primary_action_url='/create/'
                primary_action_text='Create'
            %}
            """
        )
        html = template.render(Context({}))

        assert "Create" in html
        assert "/create/" in html


@pytest.mark.django_db
class TestActionBarComponent:
    """Tests for action_bar.html component."""

    def test_renders_primary_action(self):
        """Should render primary action button."""
        template = Template(
            """
            {% include 'components/ui/action_bar.html' with
                primary_action_text='Save'
                primary_action_url='/save/'
            %}
            """
        )
        html = template.render(Context({}))

        assert "Save" in html
        assert "/save/" in html

    def test_renders_secondary_action(self):
        """Should render secondary action button."""
        template = Template(
            """
            {% include 'components/ui/action_bar.html' with
                secondary_action_text='Preview'
            %}
            """
        )
        html = template.render(Context({}))

        assert "Preview" in html

    def test_renders_tertiary_action(self):
        """Should render tertiary action button."""
        template = Template(
            """
            {% include 'components/ui/action_bar.html' with
                tertiary_action_text='Cancel'
                tertiary_action_url='/back/'
            %}
            """
        )
        html = template.render(Context({}))

        assert "Cancel" in html
        assert "/back/" in html

    def test_alignment_classes(self):
        """Should apply correct alignment classes."""
        template = Template(
            """
            {% include 'components/ui/action_bar.html' with
                align='between'
                primary_action_text='Save'
            %}
            """
        )
        html = template.render(Context({}))

        assert "justify-between" in html


@pytest.mark.django_db
class TestSkeletonComponents:
    """Tests for skeleton screen components."""

    def test_list_skeleton_renders(self):
        """Should render list skeleton with specified rows."""
        template = Template(
            """
            {% include 'components/skeletons/list_skeleton.html' with rows=3 %}
            """
        )
        html = template.render(Context({}))

        assert "animate-pulse" in html

    def test_card_grid_skeleton_renders(self):
        """Should render card grid skeleton."""
        template = Template(
            """
            {% include 'components/skeletons/card_grid_skeleton.html' with cards=4 %}
            """
        )
        html = template.render(Context({}))

        assert "animate-pulse" in html

    def test_detail_skeleton_renders(self):
        """Should render detail skeleton."""
        template = Template(
            """
            {% include 'components/skeletons/detail_skeleton.html' %}
            """
        )
        html = template.render(Context({}))

        assert "animate-pulse" in html

    def test_form_skeleton_renders(self):
        """Should render form skeleton."""
        template = Template(
            """
            {% include 'components/skeletons/form_skeleton.html' with fields=3 %}
            """
        )
        html = template.render(Context({}))

        assert "animate-pulse" in html

    def test_table_skeleton_renders(self):
        """Should render table skeleton."""
        template = Template(
            """
            {% include 'components/skeletons/table_skeleton.html' with rows=5 columns=4 %}
            """
        )
        html = template.render(Context({}))

        assert "animate-pulse" in html


@pytest.mark.django_db
class TestModalComponents:
    """Tests for modal components."""

    def test_modal_base_renders(self):
        """Should render modal base structure."""
        template = Template(
            """
            {% include 'components/modals/modal_base.html' with
                modal_id='test-modal'
                show_var='showModal'
                title='Test Modal'
            %}
            """
        )
        html = template.render(Context({}))

        assert "test-modal" in html
        assert "Test Modal" in html
        assert "showModal" in html

    def test_modal_confirm_renders(self):
        """Should render confirmation modal."""
        template = Template(
            """
            {% include 'components/modals/modal_confirm.html' with
                modal_id='confirm-modal'
                show_var='showConfirm'
                title='Confirm Action'
                message='Are you sure?'
                confirm_text='Yes'
            %}
            """
        )
        html = template.render(Context({}))

        assert "confirm-modal" in html
        assert "Confirm Action" in html
        assert "Are you sure?" in html
        assert "Yes" in html

    def test_modal_confirm_destructive_variant(self):
        """Should apply destructive styling."""
        template = Template(
            """
            {% include 'components/modals/modal_confirm.html' with
                modal_id='delete-modal'
                show_var='showDelete'
                title='Delete'
                message='Delete this item?'
                confirm_variant='destructive'
            %}
            """
        )
        html = template.render(Context({}))

        assert "btn-destructive" in html


@pytest.mark.django_db
class TestBreadcrumbComponent:
    """Tests for breadcrumb component."""

    def test_renders_breadcrumbs(self):
        """Should render breadcrumb navigation."""
        template = Template(
            """
            {% include 'components/navigation/breadcrumbs.html' %}
            """
        )
        breadcrumbs = [
            {"label": "Home", "url": "/", "is_current": False},
            {"label": "Parks", "url": "/parks/", "is_current": False},
            {"label": "Test Park", "url": None, "is_current": True},
        ]
        html = template.render(Context({"breadcrumbs": breadcrumbs}))

        assert "Home" in html
        assert "Parks" in html
        assert "Test Park" in html

    def test_renders_schema_org_markup(self):
        """Should include Schema.org BreadcrumbList."""
        template = Template(
            """
            {% include 'components/navigation/breadcrumbs.html' %}
            """
        )
        breadcrumbs = [
            {"label": "Home", "url": "/", "is_current": False, "schema_position": 1},
            {"label": "Test", "url": None, "is_current": True, "schema_position": 2},
        ]
        html = template.render(Context({"breadcrumbs": breadcrumbs}))

        assert "BreadcrumbList" in html

    def test_empty_breadcrumbs(self):
        """Should handle empty breadcrumbs gracefully."""
        template = Template(
            """
            {% include 'components/navigation/breadcrumbs.html' %}
            """
        )
        html = template.render(Context({"breadcrumbs": []}))

        # Should not error, may render nothing or empty nav
        assert html is not None


@pytest.mark.django_db
class TestStatusBadgeComponent:
    """Tests for status badge component."""

    def test_renders_status_text(self):
        """Should render status label."""
        template = Template(
            """
            {% include 'components/status_badge.html' with status='published' label='Published' %}
            """
        )
        html = template.render(Context({}))

        assert "Published" in html

    def test_applies_status_colors(self):
        """Should apply appropriate color classes for status."""
        # Test published/active status
        template = Template(
            """
            {% include 'components/status_badge.html' with status='published' %}
            """
        )
        html = template.render(Context({}))

        # Should have some indication of success/green styling
        assert "green" in html.lower() or "success" in html.lower() or "published" in html.lower()


@pytest.mark.django_db
class TestLoadingIndicatorComponent:
    """Tests for loading indicator component."""

    def test_renders_loading_indicator(self):
        """Should render loading indicator."""
        template = Template(
            """
            {% include 'htmx/components/loading_indicator.html' with text='Loading...' %}
            """
        )
        html = template.render(Context({}))

        assert "Loading" in html

    def test_renders_with_id(self):
        """Should render with specified ID for htmx-indicator."""
        template = Template(
            """
            {% include 'htmx/components/loading_indicator.html' with id='my-loader' %}
            """
        )
        html = template.render(Context({}))

        assert "my-loader" in html
