"""Track C: plan weekly blog articles from trending topics + existing coverage."""

import json
import logging
from datetime import date

from blogs.models import BlogArticle, BlogGenerationLog, BlogSettings
from blogs.services.anthropic_utils import claude_json
from blogs.services.inventory_service import gather_existing_coverage

logger = logging.getLogger(__name__)


def generate_weekly_topics(
    count,
    calendar_week=None,
    scheduled_dates=None,
    *,
    dry_run=False,
):
    settings_obj = BlogSettings.load()
    trending = settings_obj.trending_topics or []
    if not trending:
        raise ValueError(
            "trending_topics is empty; weekly planning should refresh trends first"
        )

    coverage = gather_existing_coverage(settings_obj)
    cw = calendar_week or date.today().isocalendar()[1]
    year = date.today().year
    config = settings_obj.as_prompt_config()

    external = settings_obj.external_blog_inventory or []
    external_json = json.dumps(external[:25], ensure_ascii=False)
    trending_json = json.dumps(trending[:count + 5], ensure_ascii=False)

    system = (
        f"You are an SEO strategist for {config.get('name', 'the store')}. "
        f"Language: {config.get('language', 'de')}. "
        "Return ONLY a JSON array of objects with: title, target_keyword, "
        "secondary_keywords (array), description, source_trend_keyword, gap_reason."
    )
    user = (
        f"Create {count} unique blog article plans for calendar week {cw}/{year}.\n\n"
        f"## Trending topics (what to pursue)\n{trending_json}\n\n"
        f"## Existing coverage (what to avoid duplicating)\n"
        f"### Live blog (from store blog list URL)\n{external_json}\n\n"
        f"### Summary\n{coverage.get('summary_for_prompt', '')}\n\n"
        "## Task\n"
        "1. Each plan must map to one trending topic (highest relevance first).\n"
        "2. Do NOT duplicate live blog titles, angles, or main_topics.\n"
        "3. Do NOT duplicate in-app articles listed above.\n"
        "4. Include gap_reason explaining why this trend fills a gap.\n"
        "SEO titles with keyword first."
    )

    topics = claude_json(system, user, temperature=0.7)

    if dry_run:
        return topics[:count]

    if scheduled_dates is None:
        from blogs.services.scheduling_service import random_publish_dates

        scheduled_dates = random_publish_dates(count)

    articles = []
    for i, topic in enumerate(topics[:count]):
        scheduled = (
            scheduled_dates[i]
            if i < len(scheduled_dates)
            else date.fromisocalendar(year, min(int(cw), 52), 1)
        )
        art = BlogArticle.objects.create(
            title=topic.get("title", "Untitled"),
            target_keyword=topic.get("target_keyword", ""),
            secondary_keywords=topic.get("secondary_keywords") or [],
            scheduled_date=scheduled,
            calendar_week=cw,
            status=BlogArticle.STATUS_PLANNED,
        )
        BlogGenerationLog.objects.create(
            article=art,
            step="topic_planning",
            status="completed",
            details={
                "source_trend_keyword": topic.get("source_trend_keyword"),
                "gap_reason": topic.get("gap_reason"),
            },
        )
        articles.append(art)
    return articles
