#!/usr/bin/env python3
"""SoftwareInspect synthetic reconciliation exercise, 2026-10-23.
Run with Python 3 standard library. Prints the committed results.json.
No network, CRM connection, customer data, or vendor behavior simulation.
"""
from collections import defaultdict
from datetime import datetime, timedelta
import json


def run():
    occurred = '2026-10-23T09:00:00+02:00'
    cutoff = '2026-10-23T10:00:00+02:00'
    source = []
    for n in range(1, 11):
        system = 'mail' if n <= 6 or n == 9 else 'calendar' if n in (7, 10) else 'calls'
        source.append({
            'key': f'{system}:S{n:02d}',
            'thread': 'thread:T01' if n in (1, 2) else None,
            'contact': 'contact:C01', 'owner': 'user:U01',
            'attachments': ['file:F01'] if n == 6 else [],
            'occurred_at': occurred,
            'exclusion': 'private_address_policy' if n == 9 else 'outside_history_window' if n == 10 else None,
        })
    # Eight normalized destination activity rows, including a duplicate of S02.
    destination = []
    for n in (1, 2, 2, 4, 5, 6, 7, 8):
        s = source[n - 1]
        destination.append({
            'id': f'crm:D{len(destination) + 1:02d}', 'source_key': s['key'],
            'contact': 'contact:C99' if n == 4 else s['contact'],
            'owner': 'user:U99' if n == 5 else s['owner'],
            'attachments': [] if n == 6 else list(s['attachments']),
            'recorded_at': '2026-10-23T09:25:00+02:00' if n == 8 else '2026-10-23T09:05:00+02:00',
        })
    by_key = defaultdict(list)
    for row in destination:
        by_key[row['source_key']].append(row)
    eligible = [s for s in source if not s['exclusion']]
    results = []
    for s in source:
        matches = by_key[s['key']]
        if s['exclusion']:
            issues = ['excluded_present'] if matches else []
            status = 'excluded'
        else:
            issues = []
            if not matches:
                issues.append('missing')
            if len(matches) > 1:
                issues.append('duplicate')
            for row in matches:
                for field, issue in [('contact', 'wrong_contact'), ('owner', 'wrong_owner'), ('attachments', 'attachment_mismatch')]:
                    if row[field] != s[field] and issue not in issues:
                        issues.append(issue)
                deadline = datetime.fromisoformat(s['occurred_at']) + timedelta(minutes=15)
                if datetime.fromisoformat(row['recorded_at']) > deadline and 'late' not in issues:
                    issues.append('late')
            status = 'exception' if issues else 'pass'
        results.append({'source_key': s['key'], 'status': status, 'issues': issues, 'destination_ids': [r['id'] for r in matches]})
    summary = {
        'source_events': len(source), 'excluded_events': len(source) - len(eligible),
        'expected_due_events': len(eligible), 'destination_rows': len(destination),
        'count_only_equal': len(eligible) == len(destination),
        'unique_eligible_keys_present': sum(bool(by_key[s['key']]) for s in eligible),
        'extra_duplicate_rows': sum(max(0, len(by_key[s['key']]) - 1) for s in eligible),
        'eligible_events_with_exceptions': sum(r['status'] == 'exception' for r in results),
        'clean_eligible_events': sum(r['status'] == 'pass' for r in results),
        'excluded_events_present': sum('excluded_present' in r['issues'] for r in results),
    }
    assert summary == {
        'source_events': 10, 'excluded_events': 2, 'expected_due_events': 8,
        'destination_rows': 8, 'count_only_equal': True,
        'unique_eligible_keys_present': 7, 'extra_duplicate_rows': 1,
        'eligible_events_with_exceptions': 6, 'clean_eligible_events': 2,
        'excluded_events_present': 0,
    }
    return {
        'method': 'Authored synthetic fixture; normalized logical activities, not raw vendor object counts.',
        'verified_date': '2026-10-23', 'cutoff': cutoff,
        'policy': {'latency_minutes': 15, 'scope': 'S01-S08 eligible; S09 private; S10 outside selected history window',
                   'note': 'Authored rules, not vendor defaults or service guarantees. All eligible deadlines precede cutoff.'},
        'source': source, 'destination': destination, 'results': results, 'summary': summary,
        'limits': ['Not a vendor test or observed error rate.', 'Assumes correct source keys, identity maps, complete exports, clock agreement and normalized activity grain.', 'No pagination, permissions, API failures, retention enforcement, repairs or retries executed.', 'Attachment comparison uses fixture IDs only; file content and access are not tested.'],
    }


if __name__ == '__main__':
    print(json.dumps(run(), indent=2, sort_keys=True))
