import pytest

pytestmark = pytest.mark.integration


@pytest.mark.asyncio
async def test_get_import_settings_defaults(client):
    resp = await client.get("/api/settings/import")
    assert resp.status_code == 200
    body = await resp.get_json()
    # Defaults from the migration:
    assert body["min_width"] == 0
    assert body["min_height"] == 0
    assert body["skip_transparent"] is False
    assert body["transparency_threshold"] == 0.9


@pytest.mark.asyncio
async def test_patch_import_settings(client):
    resp = await client.patch(
        "/api/settings/import",
        json={"min_width": 500, "skip_transparent": True, "transparency_threshold": 0.7},
    )
    assert resp.status_code == 200
    body = await resp.get_json()
    assert body["min_width"] == 500
    assert body["skip_transparent"] is True
    assert body["transparency_threshold"] == 0.7


@pytest.mark.asyncio
async def test_patch_rejects_non_object(client):
    resp = await client.patch("/api/settings/import", json=[1, 2, 3])
    assert resp.status_code == 400


@pytest.mark.asyncio
async def test_import_settings_phash_threshold_default(client):
    resp = await client.get("/api/settings/import")
    assert resp.status_code == 200
    assert (await resp.get_json())["phash_threshold"] == 10


@pytest.mark.asyncio
async def test_patch_phash_threshold(client):
    resp = await client.patch(
        "/api/settings/import", json={"phash_threshold": 4}
    )
    assert resp.status_code == 200
    assert (await resp.get_json())["phash_threshold"] == 4


@pytest.mark.asyncio
async def test_patch_phash_threshold_rejects_negative(client):
    resp = await client.patch(
        "/api/settings/import", json={"phash_threshold": -1}
    )
    assert resp.status_code == 400


@pytest.mark.asyncio
async def test_system_stats_shape(client):
    resp = await client.get("/api/system/stats")
    assert resp.status_code == 200
    body = await resp.get_json()
    for key in ("total_images", "total_tags", "storage_bytes", "subscription_count", "tasks", "active_batch"):
        assert key in body
    for status in ("pending", "queued", "processing", "complete", "skipped", "failed"):
        assert status in body["tasks"]


# --- FC-3d: scheduling knobs ----------------------------------------------


@pytest.mark.asyncio
async def test_get_includes_scheduling_defaults(client):
    resp = await client.get("/api/settings/import")
    body = await resp.get_json()
    assert body["download_schedule_default_seconds"] == 28800
    assert body["download_event_retention_days"] == 90
    assert body["download_failure_warning_threshold"] == 5


@pytest.mark.asyncio
async def test_patch_scheduling_defaults(client):
    resp = await client.patch("/api/settings/import", json={
        "download_schedule_default_seconds": 7200,
        "download_event_retention_days": 30,
        "download_failure_warning_threshold": 3,
    })
    assert resp.status_code == 200
    body = await resp.get_json()
    assert body["download_schedule_default_seconds"] == 7200
    assert body["download_event_retention_days"] == 30
    assert body["download_failure_warning_threshold"] == 3


@pytest.mark.asyncio
async def test_patch_rejects_below_min_interval(client):
    resp = await client.patch(
        "/api/settings/import",
        json={"download_schedule_default_seconds": 30},
    )
    assert resp.status_code == 400


@pytest.mark.asyncio
async def test_patch_rejects_above_max_interval(client):
    resp = await client.patch(
        "/api/settings/import",
        json={"download_schedule_default_seconds": 90000},
    )
    assert resp.status_code == 400


@pytest.mark.asyncio
async def test_patch_rejects_zero_retention_days(client):
    resp = await client.patch(
        "/api/settings/import",
        json={"download_event_retention_days": 0},
    )
    assert resp.status_code == 400


@pytest.mark.asyncio
async def test_patch_rejects_zero_failure_threshold(client):
    resp = await client.patch(
        "/api/settings/import",
        json={"download_failure_warning_threshold": 0},
    )
    assert resp.status_code == 400


@pytest.mark.asyncio
async def test_system_stats_integrity_counts(client, db):
    from backend.app.models import ImageRecord

    base = "stats_" + "0" * 56
    for i, status in enumerate(
        ["ok", "ok", "corrupt", "failed_verification"]
    ):
        db.add(ImageRecord(
            path=f"/images/i/{i}.jpg", sha256=base + f"{i:02d}",
            size_bytes=1, mime="image/jpeg", width=1, height=1,
            origin="imported_filesystem", integrity_status=status,
        ))
    await db.commit()

    resp = await client.get("/api/system/stats")
    assert resp.status_code == 200
    body = await resp.get_json()
    integ = body["integrity"]
    assert integ["ok"] >= 2
    assert integ["corrupt"] >= 1
    assert integ["failed_verification"] >= 1
    assert "unknown" in integ
