#!/usr/bin/env python3
"""Validate traceable quotes, not the truth or relevance of a hypothesis."""
import json
import sys


def validate(interviews, evidence):
    errors = []
    if not isinstance(interviews, list) or not interviews:
        return ['interviews must be a nonempty array']
    sources = {}
    for i, row in enumerate(interviews):
        if not isinstance(row, dict) or not all(isinstance(row.get(k), str) and row[k].strip() for k in ('id', 'text')):
            errors.append(f'interview {i}: nonempty id and text required')
            continue
        if row['id'] in sources:
            errors.append(f'duplicate interview id: {row["id"]}')
        sources[row['id']] = row['text']
    if not isinstance(evidence, list) or not evidence:
        return errors + ['evidence must be a nonempty array']
    seen = set()
    keys = {'id', 'interview_id', 'quote', 'hypothesis', 'next_check'}
    for i, row in enumerate(evidence):
        if not isinstance(row, dict) or set(row) != keys:
            errors.append(f'entry {i}: expected exactly {sorted(keys)}')
            continue
        if not all(isinstance(row[k], str) and row[k].strip() for k in keys):
            errors.append(f'entry {i}: fields must be nonempty strings')
            continue
        if row['id'] in seen:
            errors.append(f'duplicate evidence id: {row["id"]}')
        seen.add(row['id'])
        if row['interview_id'] not in sources:
            errors.append(f'{row["id"]}: unknown interview id')
        elif row['quote'] not in sources[row['interview_id']]:
            errors.append(f'{row["id"]}: quote does not match its source')
    return errors


def main():
    if len(sys.argv) != 3:
        print('Usage: python3 validate.py interviews.json evidence.json', file=sys.stderr)
        return 2
    try:
        with open(sys.argv[1], encoding='utf-8') as f:
            interviews = json.load(f)
        with open(sys.argv[2], encoding='utf-8') as f:
            evidence = json.load(f)
        errors = validate(interviews, evidence)
    except (OSError, ValueError) as exc:
        print(f'Input error: {exc}', file=sys.stderr)
        return 2
    if errors:
        print('\n'.join(errors), file=sys.stderr)
        return 1
    print(f'PASS: {len(evidence)} traceable quotes. Human context review still required.')
    return 0


if __name__ == '__main__':
    sys.exit(main())
