#!/usr/bin/env python3
"""
analyze_gacha.py
----------------
Bayesian analysis of gacha pull data.

Usage:
    python analyze_gacha.py /path/to/gacha1.json [/path/to/gacha2.json ...]

Outputs:
 - Console summary table.
 - summary_results.csv (posterior mode + 95% CI per card)
 - plots/posterior_<cardname>.png (posterior Beta PDF plots)
Requires: numpy, scipy, matplotlib
"""

import json, sys, os, csv
from collections import Counter
import numpy as np
from scipy.stats import beta
import matplotlib.pyplot as plt

def load_json(path):
    with open(path, 'r', encoding='utf-8') as f:
        return json.load(f)

def beta_mode(a, b):
    if a > 1 and b > 1:
        return (a - 1) / (a + b - 2)
    if a <= 1 and b > 1:
        return 0.0
    if b <= 1 and a > 1:
        return 1.0
    return None

def credible_interval(a, b, alpha=0.05):
    return beta.ppf(alpha/2, a, b), beta.ppf(1 - alpha/2, a, b)

def analyze_file(file_path, outdir="plots"):
    data = load_json(file_path)
    pulls = data.get('pulls', [])
    n = len(pulls)
    if not pulls:
        print(f"[!] No pulls found in {file_path}")
        return []

    counts = Counter(p['result'] for p in pulls)
    meta_map = {}
    for c in data.get('metadata', {}).get('cardConfiguration', []):
        meta_map[c.get('name')] = c.get('probability')

    os.makedirs(outdir, exist_ok=True)
    results = []

    print(f"\n=== Analyzing {file_path} ({n} pulls) ===")
    print(f"{'Item':40} {'Count':>6} {'ObsFreq':>8} {'MetaProb':>9} {'PostMode':>9} {'95% CI':>22}")
    print("-" * 100)

    for name, k in sorted(counts.items(), key=lambda kv: kv[1], reverse=True):
        a, b = k + 1, n - k + 1
        obs_freq = k / n
        mode = beta_mode(a, b)
        ci_low, ci_high = credible_interval(a, b)
        meta_prob = meta_map.get(name, None)

        print(f"{name[:40]:40} {k:6d} {obs_freq:8.4f} {meta_prob or 'N/A':>9} {mode:9.4f} [{ci_low:6.4f}, {ci_high:6.4f}]")

        # Plot posterior PDF
        xs = np.linspace(0, max(0.2, obs_freq * 3), 1000)
        ys = beta.pdf(xs, a, b)
        plt.figure(figsize=(6,3))
        plt.plot(xs, ys, color='steelblue')
        plt.title(f"{name}\nPosterior PDF (k={k}, n={n})")
        plt.xlabel("Probability of draw")
        plt.ylabel("Density")
        plt.tight_layout()
        safe_name = name.replace(" ", "_").replace("/", "_")[:60]
        plt.savefig(os.path.join(outdir, f"posterior_{safe_name}.png"))
        plt.close()

        results.append({
            "file": os.path.basename(file_path),
            "item": name,
            "count": k,
            "n": n,
            "observed_freq": obs_freq,
            "meta_prob": meta_prob,
            "posterior_mode": mode,
            "ci_low": ci_low,
            "ci_high": ci_high
        })

    return results

def main():
    if len(sys.argv) < 2:
        print("Usage: python analyze_gacha.py /path/to/gacha1.json [/path/to/gacha2.json ...]")
        sys.exit(1)

    all_results = []
    for path in sys.argv[1:]:
        all_results.extend(analyze_file(path))

    # Write summary CSV
    if all_results:
        with open("summary_results.csv", "w", newline='', encoding="utf-8") as f:
            writer = csv.DictWriter(f, fieldnames=all_results[0].keys())
            writer.writeheader()
            writer.writerows(all_results)
        print(f"\n Wrote summary_results.csv and {len(all_results)} total entres")

if __name__ == "__main__":
    main()
