#!/usr/bin/env python3
"""Evaluate frozen forecasts locally. Usage: python evaluate-forecast.py input.csv
Required columns: period,actual,baseline,assisted. Same currency/unit and horizon.
No network calls. Synthetic demo data does not establish AI performance.
"""
import csv
import json
import math
import sys

def evaluate(rows):
    if not rows:
        raise ValueError('Provide at least one period.')
    seen = set()
    for row in rows:
        if not row.get('period', '').strip() or row['period'] in seen:
            raise ValueError('Each period must be non-empty and unique.')
        seen.add(row['period'])
        for key in ('actual', 'baseline', 'assisted'):
            value = float(row[key])
            if not math.isfinite(value) or value < 0:
                raise ValueError('Amounts must be finite and non-negative.')
            row[key] = value
    total = sum(row['actual'] for row in rows)
    output = {'periods': len(rows), 'actual_total': total}
    for model in ('baseline', 'assisted'):
        absolute = sum(abs(row[model] - row['actual']) for row in rows)
        signed = sum(row[model] - row['actual'] for row in rows)
        output[model] = {
            'absolute_error_total': absolute,
            'mean_absolute_error': absolute / len(rows),
            'wape_percent': 100 * absolute / total if total else None,
            'signed_bias_percent': 100 * signed / total if total else None,
        }
    return output

if __name__ == '__main__':
    try:
        if len(sys.argv) != 2:
            raise ValueError('Usage: python evaluate-forecast.py input.csv')
        with open(sys.argv[1], newline='', encoding='utf-8-sig') as source:
            print(json.dumps(evaluate(list(csv.DictReader(source))), indent=2))
    except (ValueError, KeyError, OSError) as error:
        print(str(error), file=sys.stderr)
        sys.exit(1)
