import tempfile
from pathlib import Path

import pandas as pd

from app.jobs.import_master_image_manifest import import_master_image_manifest


def test_import_master_image_manifest_filters_known_unmatched(monkeypatch):
    with tempfile.TemporaryDirectory() as tmp_dir:
        manifest = Path(tmp_dir) / "manifest.csv"
        pd.DataFrame(
            [
                {"Name": "Unknown-1.png", "URL": "https://cdn.example/Unknown-1.png"},
                {"Name": "Unknown-2.png", "URL": "https://cdn.example/Unknown-2.png"},
            ]
        ).to_csv(manifest, index=False)

        def fake_get_session():
            class _SessionContext:
                def __enter__(self):
                    class _Session:
                        def commit(self):
                            return None

                        def rollback(self):
                            return None

                    return _Session()

                def __exit__(self, exc_type, exc, tb):
                    return False

            return _SessionContext()

        monkeypatch.setattr("db.session.get_session", fake_get_session)
        monkeypatch.setattr(
            "db.master_product_images.is_images_only_csv",
            lambda df: True,
        )
        monkeypatch.setattr(
            "db.master_product_images.import_master_product_images_dataframe",
            lambda session, df, source_label: {
                "input_rows": len(df),
                "images_upserted": 0,
                "skus_touched": 0,
                "skipped_rows": 2,
                "missing_url_rows": 0,
                "missing_name_rows": 0,
                "unmatched_rows": 2,
                "duplicate_rows_collapsed": 0,
                "sample_unmatched": ["Unknown-1.png", "Unknown-2.png"],
                "all_unmatched": ["Unknown-1.png", "Unknown-2.png"],
            },
        )

        result = import_master_image_manifest(
            files=[str(manifest)],
            apply=False,
            ignore_unmatched=["Unknown-1.png"],
            unmatched_limit=50,
        )

        assert result["sample_unmatched"] == ["Unknown-2.png"]
        assert result["ignored_unmatched_count"] == 1
        assert result["files"][0]["sample_unmatched"] == ["Unknown-2.png"]


def test_import_master_image_manifest_reads_ignore_file(monkeypatch):
    with tempfile.TemporaryDirectory() as tmp_dir:
        manifest = Path(tmp_dir) / "manifest.csv"
        ignore_file = Path(tmp_dir) / "ignore.txt"
        pd.DataFrame(
            [
                {"Name": "Unknown-1.png", "URL": "https://cdn.example/Unknown-1.png"},
                {"Name": "Unknown-2.png", "URL": "https://cdn.example/Unknown-2.png"},
                {"Name": "Unknown-3.png", "URL": "https://cdn.example/Unknown-3.png"},
            ]
        ).to_csv(manifest, index=False)
        ignore_file.write_text("Unknown-1.png\n# comment\nUnknown-2.png\n", encoding="utf-8")

        def fake_get_session():
            class _SessionContext:
                def __enter__(self):
                    class _Session:
                        def commit(self):
                            return None

                        def rollback(self):
                            return None

                    return _Session()

                def __exit__(self, exc_type, exc, tb):
                    return False

            return _SessionContext()

        monkeypatch.setattr("db.session.get_session", fake_get_session)
        monkeypatch.setattr("db.master_product_images.is_images_only_csv", lambda df: True)
        monkeypatch.setattr(
            "db.master_product_images.import_master_product_images_dataframe",
            lambda session, df, source_label: {
                "input_rows": len(df),
                "images_upserted": 0,
                "skus_touched": 0,
                "skipped_rows": 3,
                "missing_url_rows": 0,
                "missing_name_rows": 0,
                "unmatched_rows": 3,
                "duplicate_rows_collapsed": 0,
                "sample_unmatched": ["Unknown-1.png", "Unknown-2.png", "Unknown-3.png"],
                "all_unmatched": ["Unknown-1.png", "Unknown-2.png", "Unknown-3.png"],
            },
        )

        result = import_master_image_manifest(
            files=[str(manifest)],
            apply=False,
            ignore_unmatched_file=str(ignore_file),
            unmatched_limit=50,
        )

        assert result["sample_unmatched"] == ["Unknown-3.png"]
        assert result["ignored_unmatched_count"] == 2
        assert result["files"][0]["sample_unmatched"] == ["Unknown-3.png"]


def test_import_master_image_manifest_can_process_only_selected_unmatched(monkeypatch):
    with tempfile.TemporaryDirectory() as tmp_dir:
        manifest = Path(tmp_dir) / "manifest.csv"
        pd.DataFrame(
            [
                {"Name": "Unknown-1.png", "URL": "https://cdn.example/Unknown-1.png"},
                {"Name": "Unknown-2.png", "URL": "https://cdn.example/Unknown-2.png"},
                {"Name": "Unknown-3.png", "URL": "https://cdn.example/Unknown-3.png"},
            ]
        ).to_csv(manifest, index=False)

        captured = {}

        def fake_get_session():
            class _SessionContext:
                def __enter__(self):
                    class _Session:
                        def commit(self):
                            return None

                        def rollback(self):
                            return None

                    return _Session()

                def __exit__(self, exc_type, exc, tb):
                    return False

            return _SessionContext()

        def fake_import(session, df, source_label):
            captured["names"] = list(df["Name"])
            return {
                "input_rows": len(df),
                "images_upserted": 0,
                "skus_touched": 0,
                "skipped_rows": len(df),
                "missing_url_rows": 0,
                "missing_name_rows": 0,
                "unmatched_rows": len(df),
                "duplicate_rows_collapsed": 0,
                "sample_unmatched": list(df["Name"]),
                "all_unmatched": list(df["Name"]),
            }

        monkeypatch.setattr("db.session.get_session", fake_get_session)
        monkeypatch.setattr("db.master_product_images.is_images_only_csv", lambda df: True)
        monkeypatch.setattr(
            "db.master_product_images.import_master_product_images_dataframe",
            fake_import,
        )

        result = import_master_image_manifest(
            files=[str(manifest)],
            apply=False,
            only_unmatched=["Unknown-2.png"],
            unmatched_limit=50,
        )

        assert captured["names"] == ["Unknown-2.png"]
        assert result["only_unmatched_count"] == 1
        assert result["filtered_input_rows"] == 1
        assert result["files"][0]["source_input_rows"] == 3
        assert result["files"][0]["input_rows"] == 1
