#!/usr/bin/env python3
"""Fuehrt mehrere Laeufe zu einer Kurve zusammen.

    zusammenfuehren.py <ziel.json> <lauf-ordner> [<lauf-ordner> ...]

Gedacht fuer den Fall, dass erst grob und dann fein gemessen wurde. Kommt
eine Laststufe in mehreren Laeufen vor, gewinnt die aus dem SPAETEREN
Ordner - der ist in der Regel der genauere.

Die Wand wird ueber alle Stufen neu bestimmt, nicht aus den Teilen
uebernommen: mit den feinen Stufen dazwischen liegt sie woanders.
"""
import json
import sys
from pathlib import Path

FEHLER_GRENZE = 0.005
SUCHE_GRENZE = 2000
BESTELLUNG_GRENZE = 3000


def main() -> int:
    if len(sys.argv) < 3:
        print(__doc__, file=sys.stderr)
        return 1
    ziel = Path(sys.argv[1])

    je_stufe = {}
    lage = {}
    for ordner in sys.argv[2:]:
        datei = Path(ordner) / 'ergebnis-kompakt.json'
        if not datei.exists():
            print(f'  uebersprungen (keine Auswertung): {ordner}', file=sys.stderr)
            continue
        d = json.loads(datei.read_text(encoding='utf-8'))
        for s in d['stufen']:
            je_stufe[s['vus']] = s
        lage = d.get('lage') or lage

    stufen = [je_stufe[k] for k in sorted(je_stufe)]
    if not stufen:
        print('Nichts zusammenzufuehren.', file=sys.stderr)
        return 1

    wand = grund = None
    for s in stufen:
        suche = (s['schritte'].get('Suche') or {}).get('p95')
        bestellung = (s['schritte'].get('Bestellung') or {}).get('p95')
        if s['fehlerquote'] > FEHLER_GRENZE:
            wand, grund = s['vus'], f"Fehlerquote {s['fehlerquote']*100:.2f} %"
            break
        if bestellung and bestellung > BESTELLUNG_GRENZE:
            wand, grund = s['vus'], f"Bestellung dauert {bestellung/1000:.1f} s"
            break
        if suche and suche > SUCHE_GRENZE:
            wand, grund = s['vus'], f"Suche dauert {suche/1000:.1f} s"
            break

    letzte_gute = None
    for s in stufen:
        if wand is not None and s['vus'] >= wand:
            break
        letzte_gute = s['vus']

    ziel.write_text(json.dumps({
        'stufen': stufen, 'wand': wand, 'wandGrund': grund, 'letzteGuteStufe': letzte_gute,
        'grenzen': {'fehlerProzent': FEHLER_GRENZE * 100, 'sucheMs': SUCHE_GRENZE,
                    'bestellungMs': BESTELLUNG_GRENZE, 'artikelseiteMs': SUCHE_GRENZE},
        'lage': lage,
    }, indent=2, ensure_ascii=False), encoding='utf-8')

    print(f'{len(stufen)} Stufen -> {ziel}')
    print('  Stufe    Suche p95   Bestellung   Fehler   Arbeiter   Last/Kern')
    print('  ' + '-' * 66)
    for s in stufen:
        sv = s.get('server') or {}
        su = (s['schritte'].get('Suche') or {}).get('p95')
        be = (s['schritte'].get('Bestellung') or {}).get('p95')
        print('  %5d  %11s  %11s  %6.2f%%  %9s  %9s' % (
            s['vus'],
            f'{su/1000:.2f} s' if su else '-',
            f'{be/1000:.2f} s' if be else '-',
            s['fehlerquote'] * 100,
            f"{sv.get('arbeiter','-')}/{sv.get('arbeiterMax','-')}",
            f"{sv.get('lastJeKernMax','-')}"))
    print()
    print(f'  Wand bei {wand} ({grund}). Letzte unauffaellige Stufe: {letzte_gute}.')
    return 0


if __name__ == '__main__':
    raise SystemExit(main())
