"""Shared volume tiers for every seed_* command.

Every seeder accepts a `--volume` flag (`minimal` | `demo` | `heavy`) and reads
its per-entity counts from `RECORD_COUNTS` below. Keeping the tiers in one
place means a single change of dial here scales the whole demo dataset.

Tiers:

- ``minimal``: just enough to smoke-test forms and admin pages (fast).
- ``demo``: cold-boot default — every dashboard, list, and chart has visible
  data without burning minutes on every container restart.
- ``heavy``: performance-test volume. Pagination is exercised; analytics
  widgets have hundreds of rows; search returns dozens of hits.
"""

from __future__ import annotations

from typing import Literal

VolumeTier = Literal["minimal", "demo", "heavy"]


RECORD_COUNTS: dict[str, dict[str, int]] = {
    "minimal": {
        "users": 20,
        "institutions": 6,
        "documents": 25,
        "events_per_doc": 5,
        "search_queries": 8,
        "courses": 5,
        "enrolments_per_course": 10,
        "attempts_per_quiz": 2,
        "forum_threads_per_course": 2,
        "forum_posts_per_thread": 2,
        "jobs": 10,
        "alumni": 24,
        "publications_per_alumnus": 1,
        "mentorships": 8,
        "indicators": 8,
        "activities": 12,
        "reports": 4,
        "feedback_submissions": 12,
        "grant_calls": 3,
        "applications_per_call": 4,
        "scholars": 5,
        "smehub": 25,
        "glossary_entries_per_course": 6,
        "wiki_pages_per_course": 3,
        "wiki_revisions_per_page": 1,
        "wiki_watchers_per_page": 2,
        "surveys_per_course": 1,
        "questions_per_survey": 4,
        "responses_pct": 10,
        "live_sessions_per_course": 1,
        "live_attendance_per_session": 5,
        "networking_connections_per_user": 2,
        "dm_threads": 10,
        "groups": 5,
        "mentorship_opportunities": 6,
        "recommendations_per_learner": 3,
        "learning_events_per_learner": 5,
        "spotlights": 8,
        "endorsements_per_spotlight": 2,
        "broadcasts": 4,
        "conversations": 20,
        "messages_per_conv": 4,
        "audit_logs": 200,
        "notifications_per_user": 2,
    },
    "demo": {
        "users": 80,
        "institutions": 14,
        "documents": 150,
        "events_per_doc": 20,
        "search_queries": 16,
        "courses": 15,
        "enrolments_per_course": 60,
        "attempts_per_quiz": 6,
        "forum_threads_per_course": 4,
        "forum_posts_per_thread": 4,
        "jobs": 25,
        "alumni": 120,
        "publications_per_alumnus": 3,
        "mentorships": 40,
        "indicators": 24,
        "activities": 60,
        "reports": 12,
        "feedback_submissions": 120,
        "grant_calls": 12,
        "applications_per_call": 12,
        "scholars": 20,
        "smehub": 80,
        "glossary_entries_per_course": 14,
        "wiki_pages_per_course": 5,
        "wiki_revisions_per_page": 2,
        "wiki_watchers_per_page": 6,
        "surveys_per_course": 1,
        "questions_per_survey": 7,
        "responses_pct": 20,
        "live_sessions_per_course": 2,
        "live_attendance_per_session": 18,
        "networking_connections_per_user": 5,
        "dm_threads": 60,
        "groups": 16,
        "mentorship_opportunities": 30,
        "recommendations_per_learner": 5,
        "learning_events_per_learner": 18,
        "spotlights": 24,
        "endorsements_per_spotlight": 6,
        "broadcasts": 14,
        "conversations": 70,
        "messages_per_conv": 6,
        "audit_logs": 1500,
        "notifications_per_user": 6,
    },
    "heavy": {
        "users": 400,
        "institutions": 30,
        "documents": 800,
        "events_per_doc": 60,
        "search_queries": 28,
        "courses": 40,
        "enrolments_per_course": 250,
        "attempts_per_quiz": 14,
        "forum_threads_per_course": 8,
        "forum_posts_per_thread": 6,
        "jobs": 70,
        "alumni": 400,
        "publications_per_alumnus": 6,
        "mentorships": 120,
        "indicators": 60,
        "activities": 200,
        "reports": 30,
        "feedback_submissions": 600,
        "grant_calls": 25,
        "applications_per_call": 18,
        "scholars": 40,
        "smehub": 250,
        "glossary_entries_per_course": 22,
        "wiki_pages_per_course": 8,
        "wiki_revisions_per_page": 4,
        "wiki_watchers_per_page": 10,
        "surveys_per_course": 1,
        "questions_per_survey": 9,
        "responses_pct": 30,
        "live_sessions_per_course": 3,
        "live_attendance_per_session": 35,
        "networking_connections_per_user": 8,
        "dm_threads": 150,
        "groups": 30,
        "mentorship_opportunities": 80,
        "recommendations_per_learner": 5,
        "learning_events_per_learner": 35,
        "spotlights": 48,
        "endorsements_per_spotlight": 12,
        "broadcasts": 30,
        "conversations": 200,
        "messages_per_conv": 8,
        "audit_logs": 5000,
        "notifications_per_user": 12,
    },
}


def counts_for(tier: str) -> dict[str, int]:
    """Lookup the count dict for a tier; raise if unknown."""
    if tier not in RECORD_COUNTS:
        raise ValueError(
            f"Unknown volume tier {tier!r}. Choose one of: {sorted(RECORD_COUNTS)}"
        )
    return RECORD_COUNTS[tier]
