import argparse
import pandas as pd
from gp_common import Run, load_reviews

def aggregate(path="outputs/google_play_reviews.csv", root="outputs/gp_runs"):
    df = load_reviews(path)
    run = Run("review-aggregates", path, {"timezone": "aware:UTC; naive:unknown wall-clock, separated", "version": "reviewCreatedVersion; no fallback"}, root)
    run.csv("reviews_audit.csv", df)
    valid_date = df["day"].ne("")
    valid_score = df["score_valid"].notna()
    for period in ["day", "month"]:
        table = df[valid_date].groupby(["date_basis", period], dropna=False).agg(
            review_count=("row_id", "size"), valid_score_count=("score_valid", "count"),
            mean_score=("score_valid", "mean")).reset_index()
        run.csv(period + ".csv", table)
    version = df.groupby(["version", "version_source"], dropna=False).agg(
        review_count=("row_id", "size"), valid_score_count=("score_valid", "count"),
        mean_score=("score_valid", "mean")).reset_index()
    run.csv("versions.csv", version)
    for name, groups, mask in [("stars", [], valid_score),
                               ("daily_stars", ["date_basis", "day"], valid_score & valid_date),
                               ("monthly_stars", ["date_basis", "month"], valid_score & valid_date),
                               ("version_stars", ["version"], valid_score)]:
        cols = groups + ["score_valid"]
        counts = df[mask].groupby(cols).size().reset_index(name="count")
        if groups:
            counts["denominator"] = counts.groupby(groups)["count"].transform("sum")
        else:
            counts["denominator"] = counts["count"].sum()
        counts["ratio"] = counts["count"] / counts["denominator"]
        run.csv(name + ".csv", counts)
    summary = {"input_rows": len(df), "date_valid": int(valid_date.sum()),
               "score_valid": int(valid_score.sum()), "date_and_score_valid": int((valid_date & valid_score).sum()),
               "date_excluded": int((~valid_date).sum()), "score_excluded": int((~valid_score).sum()),
               "version_count_population": len(df), "unknown_version": int(df["version"].eq("unknown").sum())}
    print(summary)
    return run.finish(populations=summary)

if __name__ == "__main__":
    p = argparse.ArgumentParser(); p.add_argument("input", nargs="?", default="outputs/google_play_reviews.csv")
    aggregate(p.parse_args().input)
