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

PROJECT = Path('/home/spazio/cosmic_trigger_daily')
TEXT = PROJECT / 'text' / 'cosmic_trigger_full.txt'
FRAG_DIR = PROJECT / 'daily_fragments'
MANIFEST = PROJECT / 'manifest.json'
STATE = PROJECT / 'state.json'
TARGET = 15000
MIN_CHUNK = 10000

text = TEXT.read_text(encoding='utf-8')
# Trim obvious Royallib download notice before title, but preserve bibliographic start.
marker = 'Роберт Антон Уилсон\nКосмический триггер'
pos = text.find(marker)
if pos > 0:
    text = text[pos:]
# Normalize paragraph breaks.
text = re.sub(r'\n{3,}', '\n\n', text).strip()
paras = [p.strip() for p in re.split(r'\n\s*\n', text) if p.strip()]

FRAG_DIR.mkdir(parents=True, exist_ok=True)
for old in FRAG_DIR.glob('fragment_*.txt'):
    old.unlink()

fragments = []
current = []
cur_len = 0
start_para = 1
para_no = 0

def first_title(chunk: str) -> str:
    lines = [ln.strip() for ln in chunk.splitlines() if ln.strip()]
    # Prefer short heading-like lines.
    for ln in lines[:20]:
        if len(ln) <= 90 and not ln.endswith('.'):
            return ln
    return lines[0][:90] if lines else 'Фрагмент'

def flush(end_para):
    global current, cur_len, start_para
    if not current:
        return
    chunk = '\n\n'.join(current).strip()
    idx = len(fragments) + 1
    fn = f'fragment_{idx:03d}.txt'
    (FRAG_DIR / fn).write_text(chunk, encoding='utf-8')
    fragments.append({
        'number': idx,
        'file': str(FRAG_DIR / fn),
        'chars': len(chunk),
        'paragraph_start': start_para,
        'paragraph_end': end_para,
        'title_hint': first_title(chunk),
    })
    current = []
    cur_len = 0
    start_para = end_para + 1

for p in paras:
    para_no += 1
    add_len = len(p) + (2 if current else 0)
    # Split long-ish sections gently only if needed.
    if cur_len >= MIN_CHUNK and cur_len + add_len > TARGET:
        flush(para_no - 1)
    current.append(p)
    cur_len += add_len
flush(para_no)

manifest = {
    'book': 'Роберт Антон Уилсон — Космический триггер. Последняя тайна иллюминатов',
    'source_file': str(PROJECT / 'source' / 'cosmic_trigger_royallib.doc'),
    'text_file': str(TEXT),
    'project_dir': str(PROJECT),
    'daily_outputs_dir': str(PROJECT / 'daily_outputs'),
    'accumulating_file': str(PROJECT / 'TOOLS_QUESTIONS_INSIGHTS.md'),
    'fragment_count': len(fragments),
    'fragment_target_chars': TARGET,
    'fragments': fragments,
}
MANIFEST.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding='utf-8')
if not STATE.exists():
    STATE.write_text(json.dumps({'next_fragment': 1, 'completed': []}, ensure_ascii=False, indent=2), encoding='utf-8')
print(f'created {len(fragments)} fragments')
print('first', fragments[0])
print('last', fragments[-1])
