#!/usr/bin/env python3
import json, sys
REQUIRED = ('property','referent','version','due_at','evidence')
def validate(doc):
    errors=[]
    if not isinstance(doc, dict): return ['document_not_object']
    for k in REQUIRED:
        if k not in doc: errors.append('missing_'+k)
    if errors: return errors
    if not isinstance(doc['property'], str) or not doc['property'].strip(): errors.append('property_empty')
    if not isinstance(doc['referent'], str) or not doc['referent'].strip(): errors.append('referent_empty')
    if not isinstance(doc['version'], str) or not doc['version'].strip(): errors.append('version_empty')
    if not isinstance(doc['due_at'], str) or not doc['due_at'].strip(): errors.append('due_at_empty')
    ev=doc['evidence']
    if not isinstance(ev, list) or not ev: errors.append('evidence_missing')
    else:
        for i, row in enumerate(ev):
            if not isinstance(row, dict): errors.append(f'evidence_{i}_not_object'); continue
            for k in ('source','observed_at'):
                if not isinstance(row.get(k), str) or not row[k].strip(): errors.append(f'evidence_{i}_{k}_missing')
    return errors
def main():
    try: doc=json.load(sys.stdin)
    except Exception as e: print(json.dumps({'pass':False,'errors':['invalid_json']})); return 1
    errors=validate(doc); print(json.dumps({'pass':not errors,'errors':errors}, sort_keys=True)); return 0 if not errors else 1
if __name__=='__main__': sys.exit(main())
