import pytest
from app.services.quality_scorer import calculate_quality_score, quality_badge_tier


class TestQualityScoreCalculation:
    def test_empty_package_scores_low(self):
        score = calculate_quality_score(
            site_copy={},
            brand={},
            hero_image_url=None,
            augment_count=0,
        )
        assert isinstance(score, (int, float))
        assert 0 <= score <= 100
        assert score < 30

    def test_full_package_scores_high(self):
        score = calculate_quality_score(
            site_copy={
                "headline": "Test",
                "subheadline": "Sub",
                "about": "About content here",
                "features": [{"title": f"F{i}", "description": f"D{i}"} for i in range(6)],
                "faq_items": [{"question": f"Q{i}", "answer": f"A{i}"} for i in range(6)],
                "testimonials": [{"name": f"J{i}", "quote": "Great"} for i in range(4)],
                "pricing_tiers": [{"name": "Basic", "price": "$9"}, {"name": "Pro", "price": "$29"}],
                "how_it_works_steps": [{"title": "S1", "description": "D"}, {"title": "S2", "description": "D2"}],
                "comparison_table": {"headers": ["A", "B"], "rows": [["x", "y"]]},
            },
            brand={"options": [{"name": "Brand", "tagline": "Tag"}], "color_primary": "#4F46E5"},
            hero_image_url="https://example.com/hero.jpg",
            augment_count=4,
        )
        assert score >= 80

    def test_partial_package_scores_mid(self):
        score = calculate_quality_score(
            site_copy={
                "headline": "Test",
                "features": [{"title": f"F{i}"} for i in range(4)],
                "faq_items": [{"question": "Q", "answer": "A"}],
            },
            brand={"options": [{"name": "Brand"}]},
            hero_image_url="https://example.com/hero.jpg",
            augment_count=0,
        )
        assert 20 <= score <= 80

    def test_score_includes_augment_bonus(self):
        base = calculate_quality_score(
            site_copy={"headline": "Test"},
            brand={},
            hero_image_url=None,
            augment_count=0,
        )
        with_augments = calculate_quality_score(
            site_copy={"headline": "Test"},
            brand={},
            hero_image_url=None,
            augment_count=5,
        )
        assert with_augments > base


class TestQualityBadgeTier:
    def test_legendary_tier(self):
        assert quality_badge_tier(95) == "legendary"

    def test_premium_tier(self):
        assert quality_badge_tier(75) == "premium"

    def test_standard_tier(self):
        assert quality_badge_tier(50) == "standard"

    def test_basic_tier(self):
        assert quality_badge_tier(20) == "basic"

    def test_edge_cases(self):
        assert quality_badge_tier(0) == "basic"
        assert quality_badge_tier(100) == "legendary"
        assert quality_badge_tier(90) == "legendary"
