from datetime import datetime, timedelta
from utils.helpers import top_keywords_from_posts, parse_date_safe, calc_avg_post_interval
from services.post_consulting import analyze_posts_in_detail


def calc_exposure_score(search_exposure):
    if not search_exposure:
        return 0

    counts = [x.get("found_count", 0) for x in search_exposure]
    if not counts:
        return 0

    avg_count = sum(counts) / len(counts)
    return min(round(avg_count * 10, 2), 100)


def calc_trend_score(trends):
    results = trends.get("results", [])
    if not results:
        return 0

    scores = []
    for item in results:
        data = item.get("data", [])
        if len(data) < 2:
            continue

        values = [float(d.get("ratio", 0)) for d in data]
        if not values:
            continue

        avg_val = sum(values) / len(values)
        scores.append(min(avg_val, 100))

    if not scores:
        return 0

    return round(sum(scores) / len(scores), 2)


def analyze_posts(posts, search_exposure=None, trends=None):
    now = datetime.now()
    debug_posts = []

    for idx, post in enumerate(posts, start=1):
        raw_date = post.get("published_at", "")
        parsed_date = parse_date_safe(raw_date)
        post["published_at_obj"] = parsed_date

        debug_posts.append({
            "index": idx,
            "title": post.get("title", ""),
            "raw_date": raw_date,
            "parsed_date": parsed_date.strftime("%Y-%m-%d %H:%M:%S") if parsed_date else "",
            "parsed_ok": parsed_date is not None,
            "post_url": post.get("post_url", "")
        })

    total_posts = len(posts)
    recent_7d = 0
    recent_30d = 0

    cut_7d = now - timedelta(days=7)
    cut_30d = now - timedelta(days=30)

    for post in posts:
        dt = post.get("published_at_obj")
        if not dt:
            continue
        if dt >= cut_7d:
            recent_7d += 1
        if dt >= cut_30d:
            recent_30d += 1

    top_keywords = top_keywords_from_posts(posts, 10)
    avg_interval = calc_avg_post_interval(posts)

    activity_score = min(recent_30d * 10, 100)
    consistency_score = min(len(top_keywords) * 7, 100)
    exposure_score = calc_exposure_score(search_exposure or [])
    trend_score = calc_trend_score(trends or {"results": []})

    final_score = round(
        activity_score * 0.35 +
        consistency_score * 0.20 +
        exposure_score * 0.25 +
        trend_score * 0.20,
        2
    )

    post_analysis = analyze_posts_in_detail(posts, 10)

    return {
        "total_posts": total_posts,
        "recent_7d_posts": recent_7d,
        "recent_30d_posts": recent_30d,
        "avg_post_interval_days": avg_interval,
        "top_keywords": top_keywords,
        "activity_score": activity_score,
        "consistency_score": consistency_score,
        "exposure_score": exposure_score,
        "trend_score": trend_score,
        "final_score": final_score,
        "debug_posts": debug_posts,
        "post_analysis": post_analysis
    }