"""Tests for the Item Multi-Image upgrade (v12.10).

Validates that the existing Item module supports `cover_image` + `images[]`
without breaking the legacy `photo_url` field. All flows must remain
backward-compatible:

  - create with `photo_url` only  → response has matching `cover_image` + `images=[photo_url]`
  - create with `images[]`        → response has cover_image = images[0]
  - update item with new images   → list reflects the new order
  - max-10 cap is enforced server-side
  - search projection returns `cover_image` for thumbnail rendering
"""
import time

import pytest

from conftest import BASE_URL  # type: ignore[import-not-found]


# Tiny 1x1 PNG (transparent) base64 — enough to assert URLs round-trip.
PIXEL_PNG = (
    "data:image/png;base64,"
    "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="
)
PIXEL_JPG = (
    "data:image/jpeg;base64,"
    "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB"
    "AQEBAQEBAQEBAQEBAQEBAQEB/9sAQwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB"
    "AQEBAQEBAQEBAQEBAQEBAQEB/8AAEQgAAQABAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkK"
    "C//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYn"
    "KCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqy"
    "s7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/aAAwDAQACEQMRAD8A/v4ooooA//Z"
)


def _unique_barcode():
    return f"IMGTEST{int(time.time()*1000)}"


@pytest.mark.critical
class TestItemMultiImages:
    def test_create_with_legacy_photo_url_mirrors_into_new_fields(self, admin_session, default_company_id):
        """An item created with only `photo_url` should round-trip with cover_image + images[] populated."""
        bc = _unique_barcode()
        r = admin_session.post(
            f"{BASE_URL}/api/items",
            params={"company_id": default_company_id},
            json={
                "name": f"Legacy Photo Item {bc}",
                "barcode": bc,
                "base_unit": "PCS", "unit": "PCS",
                "category": "Grocery", "gst_rate": 18,
                "sale_price": 50, "mrp": 60,
                "photo_url": PIXEL_PNG,
            },
            timeout=20,
        )
        assert r.status_code == 200, r.text
        body = r.json()
        assert body["photo_url"] == PIXEL_PNG
        assert body["cover_image"] == PIXEL_PNG
        assert body["images"] == [PIXEL_PNG]

        # Cleanup
        admin_session.delete(f"{BASE_URL}/api/items/{body['id']}", timeout=20)

    def test_create_with_images_array_sets_cover_to_first(self, admin_session, default_company_id):
        bc = _unique_barcode()
        gallery = [PIXEL_PNG, PIXEL_JPG, PIXEL_PNG]  # third is duplicate – should be deduped
        r = admin_session.post(
            f"{BASE_URL}/api/items",
            params={"company_id": default_company_id},
            json={
                "name": f"Gallery Item {bc}",
                "barcode": bc,
                "base_unit": "PCS", "unit": "PCS",
                "category": "Grocery", "gst_rate": 18,
                "sale_price": 100,
                "images": gallery,
            },
            timeout=20,
        )
        assert r.status_code == 200, r.text
        body = r.json()
        assert body["images"][0] == PIXEL_PNG
        assert body["images"][1] == PIXEL_JPG
        # Duplicate filter
        assert len(body["images"]) == 2
        assert body["cover_image"] == PIXEL_PNG
        assert body["photo_url"] == PIXEL_PNG  # legacy mirror

        # Cleanup
        admin_session.delete(f"{BASE_URL}/api/items/{body['id']}", timeout=20)

    def test_update_reorders_cover(self, admin_session, default_company_id):
        bc = _unique_barcode()
        # Create with one image
        r = admin_session.post(
            f"{BASE_URL}/api/items",
            params={"company_id": default_company_id},
            json={
                "name": f"Reorder Item {bc}",
                "barcode": bc,
                "base_unit": "PCS", "unit": "PCS",
                "category": "Grocery", "gst_rate": 18,
                "sale_price": 100,
                "images": [PIXEL_PNG],
            },
            timeout=20,
        )
        assert r.status_code == 200
        iid = r.json()["id"]

        # Update with reordered gallery — JPG now cover
        u = admin_session.put(
            f"{BASE_URL}/api/items/{iid}",
            json={
                "name": f"Reorder Item {bc}",
                "barcode": bc,
                "base_unit": "PCS", "unit": "PCS",
                "category": "Grocery", "gst_rate": 18,
                "sale_price": 100,
                "images": [PIXEL_JPG, PIXEL_PNG],
            },
            timeout=20,
        )
        assert u.status_code == 200, u.text
        body = u.json()
        assert body["cover_image"] == PIXEL_JPG
        assert body["images"] == [PIXEL_JPG, PIXEL_PNG]

        # Cleanup
        admin_session.delete(f"{BASE_URL}/api/items/{iid}", timeout=20)

    def test_max_10_images_cap(self, admin_session, default_company_id):
        bc = _unique_barcode()
        # Build 15 unique image data-URLs (anchor suffix) — server should cap at 10
        unique_gallery = []
        for i in range(15):
            unique_gallery.append(f"{PIXEL_PNG}#g{i}")
        r = admin_session.post(
            f"{BASE_URL}/api/items",
            params={"company_id": default_company_id},
            json={
                "name": f"Cap Item {bc}",
                "barcode": bc,
                "base_unit": "PCS", "unit": "PCS",
                "category": "Grocery", "gst_rate": 18,
                "sale_price": 100,
                "images": unique_gallery,
            },
            timeout=20,
        )
        assert r.status_code == 200, r.text
        body = r.json()
        assert len(body["images"]) == 10, f"Expected images capped to 10, got {len(body['images'])}"
        assert body["cover_image"] == body["images"][0]

        # Cleanup
        admin_session.delete(f"{BASE_URL}/api/items/{body['id']}", timeout=20)

    def test_search_returns_cover_image_for_thumbnails(self, admin_session, default_company_id):
        bc = _unique_barcode()
        r = admin_session.post(
            f"{BASE_URL}/api/items",
            params={"company_id": default_company_id},
            json={
                "name": f"Search Thumb Item {bc}",
                "barcode": bc,
                "base_unit": "PCS", "unit": "PCS",
                "category": "Grocery", "gst_rate": 18,
                "sale_price": 100,
                "images": [PIXEL_JPG, PIXEL_PNG],
            },
            timeout=20,
        )
        assert r.status_code == 200
        iid = r.json()["id"]

        # Search via /items/search — slim payload, must include cover_image
        s = admin_session.get(
            f"{BASE_URL}/api/items/search",
            params={"company_id": default_company_id, "q": f"Search Thumb Item {bc}"},
            timeout=20,
        )
        assert s.status_code == 200, s.text
        rows = s.json()
        match = next((x for x in rows if x.get("name") == f"Search Thumb Item {bc}"), None)
        assert match, "Newly-created item should appear in search results"
        assert match.get("cover_image") == PIXEL_JPG
        assert match.get("photo_url") == PIXEL_JPG

        # Cleanup
        admin_session.delete(f"{BASE_URL}/api/items/{iid}", timeout=20)
