"""Synthetic-data QI starter. Python 3, standard library only. No network calls.
Usage: python analyse_appointments.py synthetic_appointments.csv
Only use approved aggregate data locally; assess small-cell disclosure before sharing.
"""
import csv
import datetime
import sys
from collections import defaultdict

FIELDS = ['week', 'mode', 'attended', 'dna', 'unknown']

def analyse(path):
    totals = defaultdict(lambda: [0, 0, 0])
    seen = set()
    with open(path, encoding='utf-8-sig', newline='') as handle:
        reader = csv.DictReader(handle)
        if reader.fieldnames != FIELDS:
            raise ValueError('Expected only columns: ' + ','.join(FIELDS))
        for number, row in enumerate(reader, 2):
            if None in row or any(value is None for value in row.values()):
                raise ValueError(f'Row {number}: unexpected or missing fields')
            week = datetime.date.fromisoformat(row['week']).isoformat()
            key = (week, row['mode'])
            if key in seen:
                raise ValueError(f'Row {number}: duplicate week/mode group')
            if not row['mode'].strip():
                raise ValueError(f'Row {number}: missing appointment mode')
            seen.add(key)
            values = [int(row[field]) for field in FIELDS[2:]]
            if any(value < 0 for value in values):
                raise ValueError(f'Row {number}: counts must be non-negative')
            totals[week] = [a+b for a,b in zip(totals[week], values)]
    if not totals:
        raise ValueError('No data rows')
    weeks = sorted(totals)
    for a, b in zip(weeks, weeks[1:]):
        if (datetime.date.fromisoformat(b)-datetime.date.fromisoformat(a)).days != 7:
            print('Warning: weeks are not consecutive seven-day intervals.', file=sys.stderr)
    return [(week, *totals[week], round(100*totals[week][1]/sum(totals[week][:2]), 2) if sum(totals[week][:2]) else '') for week in weeks]

if __name__ == '__main__':
    try:
        if len(sys.argv) != 2:
            raise ValueError('Usage: python analyse_appointments.py synthetic_appointments.csv')
        rows = analyse(sys.argv[1])
        writer = csv.writer(sys.stdout)
        writer.writerow(['week','attended','dna','unknown','dna_percent_known_completed'])
        writer.writerows(rows)
    except (ValueError, OSError) as error:
        print('Cannot analyse: ' + str(error), file=sys.stderr)
        sys.exit(1)
