"""Executed inside the pinned candidate image; never requires host PyYAML."""
from copy import deepcopy
import json
from pathlib import Path
import sys


def migrate_spec(spec):
    from app.fight_runtime import FightSettings
    from app.fall_runtime import FallSettings
    if type(spec) is not dict: raise ValueError('SPEC_MAPPING')
    new = deepcopy(spec)
    for key, engine, parser in [('fight', 'r5', FightSettings), ('fall', 'r2', FallSettings)]:
        old = spec.get(key)
        if old is None: old = {}
        if type(old) is not dict: raise ValueError('SCENARIO_MAPPING')
        new[key] = parser.parse(dict(old, engine=engine)).settings_payload()
        if new[key]['enabled'] != old.get('enabled', False): raise ValueError('ENABLED_CHANGED')
        for name in ('roi', 'roi_id', 'roi_name', 'debug_roi'):
            if name in old: new[key][name] = deepcopy(old[name])
        for name, floor in [('person_score', .25), ('joint_score', .10)]:
            if name in old and new[key][name] != max(old[name], floor): raise ValueError('SCORE_CHANGED')
    return new


def migrate_document(value, kind):
    if type(value) is not dict: raise ValueError('DOCUMENT_MAPPING')
    if kind == 'template': return migrate_spec(value)
    key = {'base': 'streams', 'runtime': 'added'}[kind]
    if type(value.get(key)) is not list: raise ValueError('DOCUMENT_LIST')
    new = deepcopy(value); new[key] = [migrate_spec(x) for x in value[key]]
    return new


def main(root):
    import yaml
    root = Path(root)
    plan = json.loads((root/'settings-inputs.json').read_text())
    result = []
    for p in plan:
        raw = (root/p['before_file']).read_bytes()
        old = json.loads(raw) if p['format'] == 'json' else yaml.safe_load(raw)
        new = migrate_document(old, p['kind'])
        encoded = raw if new == old else ((json.dumps(new, ensure_ascii=False, indent=2)+'\n').encode()
                    if p['format'] == 'json' else yaml.safe_dump(new, allow_unicode=True, sort_keys=False).encode())
        out = root/('after-'+p['kind']); out.write_bytes(encoded); out.chmod(0o600)
        result.append({'kind': p['kind'], 'changed': old != new})
    (root/'settings-result.json').write_text(json.dumps(result))


if __name__ == '__main__': main(sys.argv[1])
