"""Tests for Photo_Assets_By_SKU wide CSV transform and family vignette fill."""

from __future__ import annotations

import pandas as pd

from db.photo_assets_import import (
    fill_family_vignettes,
    is_photo_assets_by_sku_csv,
    parse_photo_assets_row,
    photo_assets_to_long_records,
    split_image_cell,
)


def test_is_photo_assets_by_sku_csv():
    wide = pd.DataFrame(
        columns=[
            "SKU",
            "Type",
            "Image_Default",
            "Image_Open",
            "Image_Closed",
            "Image_Generic",
            "Collection_Hero_Image",
            "Collection_Vignette_Images",
        ]
    )
    assert is_photo_assets_by_sku_csv(wide) is True
    assert is_photo_assets_by_sku_csv(pd.DataFrame(columns=["Name", "URL"])) is False
    assert is_photo_assets_by_sku_csv(pd.DataFrame()) is False


def test_split_image_cell_semicolon_and_pipe():
    urls = split_image_cell(
        "https://cdn.example/a.jpg; https://cdn.example/b.jpg | https://cdn.example/c.jpg"
    )
    assert urls == [
        "https://cdn.example/a.jpg",
        "https://cdn.example/b.jpg",
        "https://cdn.example/c.jpg",
    ]


def test_parse_photo_assets_row_slots_and_basename():
    row = parse_photo_assets_row(
        {
            "SKU": "ACH-B15",
            "Type": "Child",
            "Image_Closed": "https://cdn.example/Finished Render Models-CA-B15-CLOSE.png",
            "Image_Open": "https://cdn.example/Finished Render Models-CA-B15-OPEN.png",
            "Image_Generic": "https://cdn.example/B15_Base_Uni.png",
            "Collection_Hero_Image": "https://cdn.example/AnnaCaramelHarvest_Vignette1a.jpg",
            "Collection_Vignette_Images": (
                "https://cdn.example/AnnaCaramelHarvest_Vignette1a.jpg; "
                "https://cdn.example/AnnaCaramelHarvest_Vignette1b.jpg"
            ),
        }
    )
    assert row is not None
    assert row.sku == "ACH-B15"
    assert row.has_product_shot is True
    assert row.has_vignette is True
    names = {s.file_name for s in row.slots}
    assert "Finished Render Models-CA-B15-CLOSE.png" in names
    assert "AnnaCaramelHarvest_Vignette1b.jpg" in names
    closed = next(s for s in row.slots if s.slot_key == "closed")
    assert closed.view_suffix == "closed"


def test_fill_family_vignettes_within_style():
    df = pd.DataFrame(
        [
            {
                "SKU": "ASW-B12",
                "Type": "Child",
                "Image_Generic": "https://cdn.example/B12_Uni.png",
                "Collection_Vignette_Images": (
                    "https://cdn.example/AnnaSnowWhite_Vignette1a.jpg; "
                    "https://cdn.example/AnnaSnowWhite_Vignette1b.jpg"
                ),
            },
            {
                "SKU": "ASW-B15",
                "Type": "Child",
                "Image_Generic": "https://cdn.example/B15_Uni.png",
                "Collection_Vignette_Images": "",
            },
            {
                "SKU": "ACH-B12",
                "Type": "Child",
                "Image_Generic": "",
                "Collection_Vignette_Images": "",
            },
        ]
    )
    records, stats = photo_assets_to_long_records(df, known_skus=None, fill_family=True)
    by_sku: dict[str, list[str]] = {}
    for rec in records:
        by_sku.setdefault(rec["sku"], []).append(rec["name"])

    assert "AnnaSnowWhite_Vignette1a.jpg" in by_sku["ASW-B12"]
    assert "AnnaSnowWhite_Vignette1a.jpg" in by_sku["ASW-B15"]
    assert "AnnaSnowWhite_Vignette1b.jpg" in by_sku["ASW-B15"]
    assert stats["family_vignettes_filled_skus"] == 1
    # ACH has no vignette source in family → no vignette records
    assert all("Vignette" not in n for n in by_sku.get("ACH-B12", []))


def test_catalog_family_fill_for_known_peers():
    df = pd.DataFrame(
        [
            {
                "SKU": "ASW-B12",
                "Collection_Vignette_Images": "https://cdn.example/AnnaSnowWhite_Vignette1a.jpg",
            }
        ]
    )
    known = {"ASW-B12", "ASW-B99", "ASW-W3636", "ACH-B12"}
    records, stats = photo_assets_to_long_records(df, known_skus=known, fill_family=True)
    skus = {r["sku"] for r in records}
    assert "ASW-B12" in skus
    assert "ASW-B99" in skus
    assert "ASW-W3636" in skus
    assert "ACH-B12" not in skus
    assert stats["catalog_family_vignettes_filled_skus"] >= 2


def test_replace_vs_merge_sku_sets():
    df = pd.DataFrame(
        [
            {
                "SKU": "ASW-B12",
                "Image_Generic": "https://cdn.example/B12_Uni.png",
                "Collection_Vignette_Images": "https://cdn.example/AnnaSnowWhite_Vignette1a.jpg",
            },
            {
                "SKU": "ASW-B15",
                "Image_Generic": "",
                "Collection_Vignette_Images": "",
            },
        ]
    )
    _, stats = photo_assets_to_long_records(df, known_skus=None, fill_family=True)
    assert "ASW-B12" in stats["replace_skus"]
    assert "ASW-B15" in stats["merge_skus"]
    assert "ASW-B15" not in stats["replace_skus"]


def test_fill_family_vignettes_helper_direct():
    from db.photo_assets_import import PhotoAssetSkuRow, PhotoAssetSlot

    rows = {
        "FGH-B12": PhotoAssetSkuRow(
            sku="FGH-B12",
            slots=[
                PhotoAssetSlot(
                    slot_key="vignette",
                    url="https://cdn.example/GalaxyHorizon_Vignette1a.jpg",
                    file_name="GalaxyHorizon_Vignette1a.jpg",
                    view_suffix=None,
                )
            ],
        ),
        "FGH-B15": PhotoAssetSkuRow(sku="FGH-B15", slots=[]),
    }
    _, filled = fill_family_vignettes(rows)
    assert filled == 1
    assert rows["FGH-B15"].has_vignette is True
