from __future__ import annotations

import json
from pathlib import Path

import pytest

from benchmarks.accuracy.text_to_image.gbench import main as gbench_main
from tests.e2e.accuracy.helpers import infer_model_label, reset_artifact_dir
from tests.helpers.mark import hardware_test

pytestmark = [pytest.mark.diffusion, pytest.mark.full_model]


@pytest.mark.benchmark
@hardware_test(res={"cuda": "H100"}, num_cards=1)
@pytest.mark.skip(reason="#3256")
def test_gebench_h100_smoke(
    gebench_accuracy_servers,
    accuracy_artifact_root: Path,
    gebench_dataset_root: Path,
    accuracy_workers: int,
) -> None:
    model_label = infer_model_label(gebench_accuracy_servers.generate_params.model).lower()
    output_root = reset_artifact_dir(accuracy_artifact_root / f"gebench_{model_label}")

    with gebench_accuracy_servers.generate_server() as generate_server:
        for data_type in ("type3", "type4"):
            assert (
                gbench_main(
                    [
                        "generate",
                        "--dataset-root",
                        str(gebench_dataset_root),
                        "--output-root",
                        str(output_root),
                        "--base-url",
                        f"http://{generate_server.host}:{generate_server.port}",
                        "--model",
                        generate_server.model,
                        "--data-type",
                        data_type,
                        "--width",
                        "768",
                        "--height",
                        "576",
                        "--output-compression",
                        "98",
                        "--num-inference-steps",
                        "8",
                        "--workers",
                        str(accuracy_workers),
                    ]
                )
                == 0
            )

    with gebench_accuracy_servers.judge_server() as judge_server:
        for data_type in ("type3", "type4"):
            assert (
                gbench_main(
                    [
                        "evaluate",
                        "--dataset-root",
                        str(gebench_dataset_root),
                        "--output-root",
                        str(output_root),
                        "--data-type",
                        data_type,
                        "--judge-base-url",
                        f"http://{judge_server.host}:{judge_server.port}",
                        "--judge-model",
                        judge_server.model,
                        "--judge-api-key",
                        "EMPTY",
                        "--workers",
                        str(accuracy_workers),
                    ]
                )
                == 0
            )

    assert gbench_main(["summarize", "--output-root", str(output_root)]) == 0

    summary = json.loads((output_root / "summary.json").read_text(encoding="utf-8"))
    assert "generation" in summary
    assert "evaluation" in summary

    for data_type in ("type3", "type4"):
        assert data_type in summary["generation"]["by_type"]
        assert summary["generation"]["by_type"][data_type]["count"] > 0
        assert data_type in summary["evaluation"]["by_type"]
        assert summary["evaluation"]["by_type"][data_type]["count"] > 0

    assert summary["evaluation"]["overall_mean"] >= 0.45
    assert summary["evaluation"]["by_type"]["type3"]["overall_mean"] >= 0.45
    assert summary["evaluation"]["by_type"]["type4"]["overall_mean"] >= 0.45
