"""Reproduce TriviaPot charts from the adjacent sanitized activity.json.

Install matplotlib==3.10.8. Run: python reproduce-charts.py [path/to/activity.json]
Counts are repository events, not continuous agent execution or run durations.
The prototype-period curve and totals are recalculated from repositoryPRs;
retainedSessionPRs is a separate evidence subset and is not total output.
"""
import json
import sys
from datetime import datetime, timezone
from pathlib import Path

import matplotlib
matplotlib.use('Agg')
import matplotlib.dates as dates
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator

source = Path(sys.argv[1]) if len(sys.argv) > 1 else Path(__file__).with_name('activity.json')
data = json.loads(source.read_text())
evidence = json.loads(source.with_name('evidence.json').read_text())


def prototype_period_points(repository_points, start):
    """Count opening and merge events separately from the inclusive UTC day."""
    created = merged = previous_merged = 0
    points = []
    for day in repository_points:
        merge_events = day['merged'] - previous_merged
        previous_merged = day['merged']
        if day['date'] < start[:10]:
            continue
        created += day['newItems']
        merged += merge_events
        points.append({'date': day['date'], 'created': created, 'merged': merged,
                       'newItems': day['newItems'], 'mergeEvents': merge_events})
    return points


period = data['prototypePeriodPRs']
recalculated = prototype_period_points(data['repositoryPRs']['points'], period['startInclusive'])
assert recalculated == period['points'], 'Prototype-period daily aggregation differs'
assert recalculated[-1]['created'] == evidence['prototypePeriod']['createdPRs']
assert recalculated[-1]['merged'] == evidence['prototypePeriod']['mergedPRs']
assert recalculated[-1]['date'] == period['lastEvent'][:10]
assert evidence['prototypePeriod']['createdPRsMerged'] + evidence['prototypePeriod']['mergedPRsCreatedBeforePeriod'] == recalculated[-1]['merged']

BG, INK, MUTED, GRID = '#111317', '#eeede7', '#b4b5af', '#34373b'
GREEN, BLUE, PURPLE = '#bada74', '#87bdf9', '#ba9df3'
plt.rcParams.update({
    'figure.facecolor': BG, 'axes.facecolor': BG, 'savefig.facecolor': BG,
    'text.color': INK, 'axes.labelcolor': MUTED, 'xtick.color': MUTED,
    'ytick.color': MUTED, 'axes.edgecolor': GRID, 'font.family': 'DejaVu Sans',
    'font.size': 12, 'svg.fonttype': 'path', 'svg.hashsalt': 'triviapot-study-v1',
})


def render(key, name, title, ylabel, series, footnote, marker=None):
    points = data[key]['points']
    times = [datetime.fromisoformat(p['date']).replace(tzinfo=timezone.utc) for p in points]
    fig, ax = plt.subplots(figsize=(13, 5.6))
    fig.subplots_adjust(left=.08, right=.96, top=.82, bottom=.19)
    ax.set_title(title, loc='left', fontsize=21, weight='bold', pad=24)
    ax.spines[['top', 'right']].set_visible(False)
    ax.grid(axis='y', color=GRID, linewidth=.7)
    ax.set_ylabel(ylabel)
    ax.yaxis.set_major_locator(MaxNLocator(integer=True))
    locator = dates.AutoDateLocator(minticks=4, maxticks=7)
    ax.xaxis.set_major_locator(locator)
    ax.xaxis.set_major_formatter(dates.ConciseDateFormatter(locator))
    for field, label, color in series:
        values = [p[field] for p in points]
        ax.step(times, values, where='post', color=color, linewidth=3,
                label=f'{label} · {values[-1]:,}')
        ax.scatter(times[-1], values[-1], color=color, s=55, zorder=5)
    if marker:
        ax.axvline(datetime.fromisoformat(marker).replace(tzinfo=timezone.utc),
                   color=PURPLE, linestyle='--', linewidth=1.5,
                   label='Autonomous prototype begins · May 1')
    ax.set_ylim(bottom=0)
    ax.legend(loc='upper left', frameon=False, labelcolor=INK, fontsize=11)
    ax.margins(x=.025)
    fig.text(.08, .045, footnote, fontsize=10, color=MUTED)
    output = source.parent / name
    fig.savefig(output, metadata={'Date': None})
    output.write_text('\n'.join(line.rstrip() for line in output.read_text().splitlines()) + '\n')
    plt.close(fig)


render('repositoryPRs', 'work-progress.svg', 'The full repository history',
       'Cumulative pull requests', [('created', 'Opened', BLUE), ('merged', 'Merged', GREEN)],
       'UTC · Earlier application + autonomous prototype from May · Ends at the last PR event: November 2, 2026',
       marker='2026-05-01')
render('repositoryIssues', 'issue-progress.svg', 'Issues created and closed',
       'Issues', [('created', 'Created', BLUE), ('closed', 'Closed', GREEN), ('open', 'Still open', PURPLE)],
       'UTC · End-of-day states include reopenings · Closed includes completed and not-planned issues · Ends August 28, 2026')
render('prototypePeriodPRs', 'prototype-progress.svg', 'Fully autonomous development from May onward',
       'Cumulative pull requests', [('created', 'Opened', BLUE), ('merged', 'Merged', GREEN)],
       'UTC · May 1–November 2, 2026 · 2 merges belong to PRs opened before May · Attribution confirmed by the operator')
print(json.dumps({'source': str(source), 'figures': 3, 'prototypePeriod': recalculated[-1]}))
