from app.core.security import get_password_hash
from app.models.enums import UserRole
from app.models.user import User


def test_parser_performance_requires_super_admin(client, auth_headers, seed_data, db):
    agent = User(
        agency_id=seed_data["agency"].id,
        email="agent@test.com",
        full_name="Test Agent",
        hashed_password=get_password_hash("Agent@12345"),
        role=UserRole.AGENT,
        is_active=True,
    )
    db.add(agent)
    db.commit()

    agent_login = client.post(
        "/api/v1/auth/login",
        json={"email": "agent@test.com", "password": "Agent@12345"},
    )
    assert agent_login.status_code == 200
    agent_headers = {"Authorization": f"Bearer {agent_login.json()['access_token']}"}

    denied_agent = client.get("/api/v1/parser/performance", headers=agent_headers)
    assert denied_agent.status_code == 403

    denied_admin = client.get("/api/v1/parser/performance", headers=auth_headers)
    assert denied_admin.status_code == 403


def test_super_admin_parser_performance(client, db, seed_data):
    super_admin = User(
        agency_id=seed_data["agency"].id,
        email="super-parser@test.com",
        full_name="Super Parser",
        hashed_password=get_password_hash("Super@12345"),
        role=UserRole.SUPER_ADMIN,
        is_active=True,
    )
    db.add(super_admin)
    db.commit()

    login = client.post("/api/v1/auth/login", json={"email": "super-parser@test.com", "password": "Super@12345"})
    assert login.status_code == 200
    headers = {"Authorization": f"Bearer {login.json()['access_token']}"}

    ok = client.get("/api/v1/parser/performance", headers=headers)
    assert ok.status_code == 200
    body = ok.json()
    assert "summary" in body
    assert "by_company" in body
    assert "by_field" in body
    assert "recent_reviews" in body
    assert "overall_parser_score" in body["summary"]

    scoped = client.get("/api/v1/super-admin/parser-performance", headers=headers)
    assert scoped.status_code == 200
