#!/usr/bin/env python3
import argparse, json
from datetime import datetime
from pathlib import Path

PROJECT = Path('/home/spazio/cosmic_trigger_daily')
MANIFEST = PROJECT / 'manifest.json'
STATE = PROJECT / 'state.json'


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument('--peek', action='store_true', help='Print next fragment without advancing state')
    ap.add_argument('--reset', type=int, help='Set next fragment number and exit')
    args = ap.parse_args()

    manifest = json.loads(MANIFEST.read_text(encoding='utf-8'))
    state = json.loads(STATE.read_text(encoding='utf-8')) if STATE.exists() else {'next_fragment': 1, 'completed': []}

    if args.reset is not None:
        if args.reset < 1 or args.reset > manifest['fragment_count'] + 1:
            raise SystemExit(f'--reset must be 1..{manifest["fragment_count"] + 1}')
        state['next_fragment'] = args.reset
        state.setdefault('completed', [])
        STATE.write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding='utf-8')
        print(json.dumps({'status': 'reset', 'next_fragment': args.reset}, ensure_ascii=False))
        return

    n = int(state.get('next_fragment', 1))
    total = int(manifest['fragment_count'])
    if n > total:
        print(json.dumps({
            'status': 'complete',
            'book': manifest['book'],
            'message': 'Все фрагменты книги уже обработаны.',
            'total_fragments': total,
            'project_dir': manifest['project_dir'],
            'accumulating_file': manifest['accumulating_file'],
        }, ensure_ascii=False))
        return

    frag = manifest['fragments'][n - 1]
    text = Path(frag['file']).read_text(encoding='utf-8')
    payload = {
        'status': 'ok',
        'book': manifest['book'],
        'fragment_number': n,
        'total_fragments': total,
        'title_hint': frag.get('title_hint'),
        'chars': frag.get('chars'),
        'paragraph_start': frag.get('paragraph_start'),
        'paragraph_end': frag.get('paragraph_end'),
        'project_dir': manifest['project_dir'],
        'daily_outputs_dir': manifest['daily_outputs_dir'],
        'accumulating_file': manifest['accumulating_file'],
        'copyright_note': 'Use only transformative summary/synthesis; do not reproduce long book passages.',
        'fragment_text': text,
    }

    if not args.peek:
        state.setdefault('completed', []).append({'fragment': n, 'emitted_at': datetime.now().isoformat(timespec='seconds')})
        state['next_fragment'] = n + 1
        STATE.write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding='utf-8')

    print(json.dumps(payload, ensure_ascii=False))


if __name__ == '__main__':
    main()
