#!/usr/bin/env python3
"""Reproduce the sensitivity table using Python 3 standard library only.
Usage: python3 reproduce.py [directory containing planning_decisions.csv]
Original code copyright 2026 Matt Lenzie / Construction Capital, MIT licence.
See LICENSE.txt for code, text and source-data rights.
"""
import csv
import json
import sys
from pathlib import Path


def calculate(folder):
    rows = list(csv.DictReader((folder / 'planning_decisions.csv').open()))
    groups = list(dict.fromkeys(row['geography'] for row in rows))
    result = []
    for group in groups:
        years = []
        for year in (2025, 2026):
            r = next(r for r in rows if r['geography'] == group and r['quarter'] == f'{year}-Q3')
            a, b, u = (int(r[k]) for k in ('approved', 'refused', 'unknown_outcome'))
            assert a + b == int(r['known_decisions'])
            years.append(dict(year=year, approved=a, refused=b, unknown=u,
                              authorities=int(r['authorities']), rate=100*a/(a+b),
                              lower=100*a/(a+b+u), upper=100*(a+u)/(a+b+u)))
        old, new = years
        assert old['authorities'] == new['authorities']
        low, high = new['lower']-old['upper'], new['upper']-old['lower']
        result.append(dict(geography=group, authorities=new['authorities'],
                           old=old, new=new, change=new['rate']-old['rate'],
                           minimum_change=low, maximum_change=high,
                           direction='Always falls' if high < 0 else 'Always rises' if low > 0 else 'Can change direction'))
    return result


if __name__ == '__main__':
    folder = Path(sys.argv[1]) if len(sys.argv)>1 else Path(__file__).parent
    data = calculate(folder)
    flat = [{k:v for k,v in r.items() if k not in ('old','new')} | {
        f'{year}_{k}':v for year in ('old','new') for k,v in r[year].items()} for r in data]
    with (folder/'sensitivity_bounds.csv').open('w', newline='') as f:
        writer=csv.DictWriter(f, fieldnames=list(flat[0]));writer.writeheader();writer.writerows(flat)
    (folder/'data.json').write_text(json.dumps(data,indent=2)+'\n')
    print(f'Reproduced {len(data)} geographies into sensitivity_bounds.csv and data.json')
