"""Tests 3, 7, 8: Profile Engine section counts, parity, non-default differs."""
import copy
import pytest
from app.services.blueprint import DEFAULT_SECTIONS, CONTENT_DEPTH_PRESETS, get_default_blueprint
from app.services.profiles import (
    build_default_profile_config,
    get_sections_for_profile,
    STARTER_PROFILES,
)


EXPECTED_PROFILE_SECTION_COUNTS = {
    "affiliate-landing": 10,
    "authority-knowledge": 12,
    "saas-product": 12,
    "local-services": 12,
}


class TestDefaultProfileParity:
    """Test 3: Default profile produces identical output to legacy get_default_blueprint()."""

    def test_default_config_has_all_section_keys(self):
        config = build_default_profile_config()
        all_keys = [s["key"] for s in DEFAULT_SECTIONS]
        assert config["sections"] == all_keys

    def test_default_profile_comprehensive_matches_legacy(self):
        config = build_default_profile_config()
        profile_sections, profile_mult = get_sections_for_profile(config, "comprehensive")
        legacy_bp = get_default_blueprint("comprehensive")
        legacy_sections = legacy_bp["sections"]

        profile_keys = [s["key"] for s in profile_sections]
        legacy_keys = [s["key"] for s in legacy_sections]
        assert profile_keys == legacy_keys

        profile_enabled = sorted([s["key"] for s in profile_sections if s.get("enabled")])
        legacy_enabled = sorted([s["key"] for s in legacy_sections if s.get("enabled")])
        assert profile_enabled == legacy_enabled

        assert profile_mult == legacy_bp["content_multiplier"]

    def test_default_profile_minimal_matches_legacy(self):
        config = build_default_profile_config()
        profile_sections, profile_mult = get_sections_for_profile(config, "minimal")
        legacy_bp = get_default_blueprint("minimal")

        profile_enabled = sorted([s["key"] for s in profile_sections if s.get("enabled")])
        legacy_enabled = sorted([s["key"] for s in legacy_bp["sections"] if s.get("enabled")])
        assert profile_enabled == legacy_enabled
        assert profile_mult == legacy_bp["content_multiplier"]

    def test_default_profile_legendary_matches_legacy(self):
        config = build_default_profile_config()
        profile_sections, profile_mult = get_sections_for_profile(config, "legendary")
        legacy_bp = get_default_blueprint("legendary")

        profile_enabled = sorted([s["key"] for s in profile_sections if s.get("enabled")])
        legacy_enabled = sorted([s["key"] for s in legacy_bp["sections"] if s.get("enabled")])
        assert profile_enabled == legacy_enabled
        assert profile_mult == legacy_bp["content_multiplier"]

    def test_default_profile_has_all_depth_presets(self):
        config = build_default_profile_config()
        assert set(config["depth_presets"].keys()) == {"minimal", "standard", "comprehensive", "legendary"}


class TestProfileSectionCounts:
    """Test 7: Each profile's sections match expected counts."""

    def test_default_section_count(self):
        all_keys = [s["key"] for s in DEFAULT_SECTIONS]
        assert len(all_keys) == 17

    @pytest.mark.parametrize("profile", STARTER_PROFILES)
    def test_starter_profile_section_counts(self, profile):
        slug = profile["slug"]
        config = profile["config"]
        expected = EXPECTED_PROFILE_SECTION_COUNTS.get(slug)
        if expected is not None:
            assert len(config["sections"]) == expected, f"{slug}: expected {expected} sections, got {len(config['sections'])}"

    @pytest.mark.parametrize("profile", STARTER_PROFILES)
    def test_profile_sections_are_valid_keys(self, profile):
        valid_keys = {s["key"] for s in DEFAULT_SECTIONS}
        for key in profile["config"]["sections"]:
            assert key in valid_keys, f"{profile['slug']}: unknown section key '{key}'"

    @pytest.mark.parametrize("profile", STARTER_PROFILES)
    def test_profile_depth_sections_subset_of_profile_sections(self, profile):
        config = profile["config"]
        profile_sections = set(config["sections"])
        for depth_name, preset in config.get("depth_presets", {}).items():
            for key in preset.get("sections", []):
                assert key in profile_sections, f"{profile['slug']}/{depth_name}: depth section '{key}' not in profile sections"


class TestNonDefaultProfileDiffers:
    """Test 8: Non-default profiles produce different blueprints than default."""

    @pytest.mark.parametrize("profile", STARTER_PROFILES)
    def test_starter_profile_sections_differ_from_default(self, profile):
        default_config = build_default_profile_config()
        default_sections = set(default_config["sections"])
        profile_sections = set(profile["config"]["sections"])
        assert profile_sections != default_sections, f"{profile['slug']} has identical sections to default"

    @pytest.mark.parametrize("profile", STARTER_PROFILES)
    def test_starter_profile_discovery_fields_differ(self, profile):
        default_config = build_default_profile_config()
        default_titles = [s["step_title"] for s in default_config["discovery_fields"]]
        profile_titles = [s["step_title"] for s in profile["config"]["discovery_fields"]]
        assert profile_titles != default_titles, f"{profile['slug']} has identical discovery field titles to default"
