from django.test import TestCase
from django.urls import reverse

from portfolio.models import ArchiveCategory, PortfolioItem


class ThreeDModelsCategoryTests(TestCase):
    def setUp(self):
        self.model_category = ArchiveCategory.objects.get(slug="3d-models")
        self.model_category.description = "Three-dimensional archive models."
        self.model_category.save(update_fields=["description"])

        self.standard_category = ArchiveCategory.objects.create(
            name="Paintings",
            slug="paintings",
            category_type=ArchiveCategory.TYPE_TIMELINE,
        )

        self.model_item = PortfolioItem.objects.create(
            category=self.model_category,
            inventory_id="3D-001",
            title="Agia Solomoni Church",
            year=1984,
            date_text="1984",
            description="This description must not appear on the 3D detail page.",
            model_viewer_url=(
                "https://apacwebstorage.hpcf.cyi.ac.cy/ephemera/images/"
                "agia_solomoni_church.jpg"
            ),
        )

    def test_3d_category_opens_items_directly_without_dates(self):
        response = self.client.get(
            reverse("category_timeline", args=[self.model_category.slug])
        )

        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, "sections/category_direct_items.html")
        self.assertContains(response, "Agia Solomoni Church")
        self.assertNotContains(response, "1984")
        self.assertNotContains(response, "Explore period")

    def test_3d_period_url_redirects_to_direct_category_page(self):
        response = self.client.get(
            reverse(
                "items_by_category_decade",
                args=[self.model_category.slug, "1980"],
            )
        )

        self.assertRedirects(
            response,
            reverse("category_timeline", args=[self.model_category.slug]),
        )

    def test_3d_item_detail_shows_only_the_viewer_content(self):
        response = self.client.get(
            reverse("portfolio_item_detail", args=[self.model_item.pk])
        )

        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "data-image-viewer")
        self.assertContains(response, self.model_item.model_viewer_url)
        self.assertNotContains(response, "1984")
        self.assertNotContains(response, "This description must not appear")
        self.assertNotContains(response, "itemDetailsAccordion")

    def test_standard_category_keeps_timeline_experience(self):
        PortfolioItem.objects.create(
            category=self.standard_category,
            title="Archive painting",
            year=1952,
        )

        response = self.client.get(
            reverse("category_timeline", args=[self.standard_category.slug])
        )

        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, "sections/category_timeline.html")
        self.assertContains(response, "1950s")

    def test_viewer_type_is_detected_from_url(self):
        self.assertEqual(self.model_item.model_viewer_type, "image")

        self.model_item.model_viewer_url = "https://example.com/model.glb"
        self.assertEqual(self.model_item.model_viewer_type, "model")

        self.model_item.model_viewer_url = "https://example.com/embedded-viewer/42"
        self.assertEqual(self.model_item.model_viewer_type, "embed")
