"""Tests for the Bulk Import multi-image upgrade (v12.12).

Validates that the Items bulk import (both CSV path and Excel template path)
correctly populates `cover_image` + `images[]` while preserving backward compat.

Acceptance:
  - CSV import with `image_1 ... image_3` columns → `images=[i1,i2,i3]`, `cover_image=i1`.
  - CSV import with `cover_image` set + `images` (semicolon-separated) → cover honoured, dedupe applied.
  - Excel import template returns a workbook whose row 1 contains the new columns
    "Cover Image", "Image 1"…"Image 10".
"""
import io

import pytest

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


PIXEL_URL_1 = "https://cdn.example.com/items/cal10/1.jpg"
PIXEL_URL_2 = "https://cdn.example.com/items/cal10/2.jpg"
PIXEL_URL_3 = "https://cdn.example.com/items/cal10/3.jpg"


@pytest.mark.critical
class TestBulkImportMultiImage:
    def test_csv_import_with_image_columns(self, admin_session, default_company_id):
        unique = "BulkCSVImg_" + str(int(__import__('time').time() * 1000))
        csv_text = (
            "name,code,hsn,unit,category,gst_rate,sale_price,purchase_price,mrp,opening_stock,current_stock,low_stock_threshold,image_1,image_2,image_3\n"
            f"{unique},CSVIMG,8481,PCS,Plumbing,18,500,400,600,10,10,2,{PIXEL_URL_1},{PIXEL_URL_2},{PIXEL_URL_3}\n"
        )
        files = {"file": (f"{unique}.csv", csv_text.encode("utf-8"), "text/csv")}
        r = admin_session.post(
            f"{BASE_URL}/api/items/import-csv",
            params={"company_id": default_company_id},
            files=files,
            headers={"Content-Type": None},  # let requests build multipart boundary
            timeout=30,
        )
        assert r.status_code == 200, r.text
        body = r.json()
        assert body["created"] >= 1, body

        # Fetch the created item and verify multi-image population
        ls = admin_session.get(
            f"{BASE_URL}/api/items",
            params={"company_id": default_company_id, "search": unique},
            timeout=20,
        )
        assert ls.status_code == 200
        match = next((i for i in ls.json() if i["name"] == unique), None)
        assert match, "Imported item should exist"
        assert match["cover_image"] == PIXEL_URL_1
        assert match["images"] == [PIXEL_URL_1, PIXEL_URL_2, PIXEL_URL_3]
        assert match["photo_url"] == PIXEL_URL_1  # legacy mirror

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

    def test_csv_import_cover_plus_semicolon_images(self, admin_session, default_company_id):
        unique = "BulkCSVCover_" + str(int(__import__('time').time() * 1000))
        # cover_image set explicitly + images list contains duplicates (must be deduped)
        csv_text = (
            "name,code,hsn,unit,category,gst_rate,sale_price,purchase_price,mrp,opening_stock,current_stock,low_stock_threshold,cover_image,images\n"
            f"{unique},BULKCOV,8481,PCS,Tools,18,250,200,300,5,5,1,{PIXEL_URL_2},{PIXEL_URL_1};{PIXEL_URL_2};{PIXEL_URL_3}\n"
        )
        files = {"file": (f"{unique}.csv", csv_text.encode("utf-8"), "text/csv")}
        r = admin_session.post(
            f"{BASE_URL}/api/items/import-csv",
            params={"company_id": default_company_id},
            files=files,
            headers={"Content-Type": None},
            timeout=30,
        )
        assert r.status_code == 200, r.text

        ls = admin_session.get(
            f"{BASE_URL}/api/items",
            params={"company_id": default_company_id, "search": unique},
            timeout=20,
        )
        match = next((i for i in ls.json() if i["name"] == unique), None)
        assert match
        # Cover MUST come first; URL_2 was the explicit cover.
        assert match["cover_image"] == PIXEL_URL_2
        assert match["images"][0] == PIXEL_URL_2
        # All three URLs present, order: cover, then the gallery preserving original order MINUS duplicates of cover.
        assert set(match["images"]) == {PIXEL_URL_1, PIXEL_URL_2, PIXEL_URL_3}
        assert len(match["images"]) == 3  # de-duped

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

    def test_excel_template_includes_multi_image_columns(self, admin_session):
        """Downloaded template MUST advertise the 10 image columns + Cover Image."""
        from openpyxl import load_workbook
        r = admin_session.get(f"{BASE_URL}/api/items/import/template", timeout=30)
        assert r.status_code == 200, r.text
        wb = load_workbook(io.BytesIO(r.content), data_only=True, read_only=True)
        sheet = wb["Items"]
        headers = [c.value for c in next(sheet.iter_rows(min_row=1, max_row=1))]
        # New columns must all be present
        for expected in ["Cover Image", "Image 1", "Image 5", "Image 10"]:
            assert expected in headers, f"Template missing '{expected}' column. Got: {headers}"
        # Backward compat — existing columns must still be present
        for legacy in ["Item name*", "Sale price", "HSN", "Tax Rate", "Base Unit (x)"]:
            assert legacy in headers, f"Template lost legacy column '{legacy}'"
