from datetime import UTC, datetime, timedelta

import pytest

from backend.app.models import Artist, ImageRecord, Source

pytestmark = pytest.mark.integration


async def _img(db, n):
    rec = ImageRecord(
        path=f"/images/ap/{n}.jpg", sha256=f"ap{n:062d}",
        size_bytes=1, mime="image/jpeg", width=1, height=1,
        origin="imported_filesystem", integrity_status="unknown",
    )
    rec.created_at = datetime.now(UTC) - timedelta(minutes=n)
    rec.effective_date = rec.created_at  # no post → tracks created_at (0035)
    db.add(rec)
    await db.flush()
    return rec


async def _artist_source(db, name, slug):
    a = Artist(name=name, slug=slug)
    db.add(a)
    await db.flush()
    s = Source(artist_id=a.id, platform="patreon",
               url=f"https://patreon.test/{slug}")
    db.add(s)
    await db.flush()
    return a, s


@pytest.mark.asyncio
async def test_scroll_artist_null_when_none(client, db):
    rec = await _img(db, 1)
    await db.commit()
    resp = await client.get("/api/gallery/scroll?limit=10")
    body = await resp.get_json()
    item = next(i for i in body["images"] if i["id"] == rec.id)
    assert item["artist"] is None


@pytest.mark.asyncio
async def test_scroll_artist_via_artist_id(client, db):
    # FC-2d-vii-c: the canonical resolution path is image_record.artist_id
    # (covers folder-style images with no provenance too).
    rec = await _img(db, 1)
    a, _ = await _artist_source(db, "Folder", "folder")
    rec.artist_id = a.id
    await db.flush()
    await db.commit()

    resp = await client.get("/api/gallery/scroll?limit=10")
    assert resp.status_code == 200
    body = await resp.get_json()
    item = next(i for i in body["images"] if i["id"] == rec.id)
    assert item["artist"] == {"name": "Folder", "slug": "folder"}
