#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Відповідь розробника на зауваження Редактора — репліка в ту саму нитку.

Доти зауваження було однобічним: Редактор писав, а відповідь ішла в обхід —
через замовника. Три питання за один день («золоті вірші у множині?»,
«чи перебудовувати сітку?») коштували трьох обертів через посередника.
Тепер відповідь лягає поруч із зауваженням, і Редактор бачить її після ↻.

    .venv/bin/python ua_build/reply.py Level4_A12_UA_v01 p1b17 \\
        "так, дві відповіді з семи не збігалися. Перебудував."

На сервері те саме через контейнер:

    docker exec bibletime-editor python /app/ua_build/reply.py \\
        Level4_A12_UA_v01 p1b17 "текст"

Без аргументів після стема — показує всі відкриті зауваження з нитками.
"""
import argparse
import json
import os
import sys
from datetime import datetime

HERE = os.path.dirname(os.path.abspath(__file__))
ROOT = os.path.dirname(HERE)
EDITOR = os.path.join(ROOT, 'editor')


def path_for(stem):
    return os.path.join(EDITOR, 'notes_%s.json' % stem)


def load(stem):
    p = path_for(stem)
    if not os.path.exists(p):
        raise SystemExit('немає %s — відкритих зауважень для цього буклета '
                         'немає' % os.path.relpath(p, ROOT))
    return p, json.load(open(p, encoding='utf-8'))


def show(stem):
    _p, doc = load(stem)
    for n in doc.get('notes') or []:
        print('── %s (стор. %s) ──' % (n.get('key'), n.get('page')))
        if n.get('note'):
            print('   правка тексту: %s' % n['note'][:90])
        if n.get('comment'):
            print('   Редактор: %s' % n['comment'])
        for r in n.get('replies') or []:
            who = 'Розробник' if r.get('who') == 'dev' else 'Редактор'
            print('   %s: %s' % (who, r.get('text', '')))
        print()


def add(stem, key, text, who='dev'):
    p, doc = load(stem)
    notes = doc.get('notes') or []
    target = next((n for n in notes if n.get('key') == key), None)
    if target is None:
        raise SystemExit('у %s немає зауваження до блока %s. Є: %s'
                         % (os.path.basename(p), key,
                            ', '.join(n.get('key', '?') for n in notes) or '—'))
    target.setdefault('replies', []).append({
        'who': who, 'text': text,
        'at': datetime.now().isoformat(timespec='seconds')})
    tmp = p + '.tmp'
    with open(tmp, 'w', encoding='utf-8') as fh:
        json.dump(doc, fh, ensure_ascii=False, indent=1)
    os.replace(tmp, p)
    print('додано до %s: %s' % (key, text[:70]))
    print('Редактор побачить після ↻ у панелі.')


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument('stem', help='напр. Level4_A12_UA_v01')
    ap.add_argument('key', nargs='?', help='блок, напр. p1b17')
    ap.add_argument('text', nargs='?', help='текст відповіді')
    ap.add_argument('--as-editor', action='store_true',
                    help='писати від імені Редактора (для перевірок)')
    a = ap.parse_args()
    if not a.key:
        return show(a.stem)
    if not a.text:
        raise SystemExit('вкажи текст відповіді')
    add(a.stem, a.key, a.text, 'editor' if a.as_editor else 'dev')


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