#!/usr/bin/env python
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import json
import os
import sys

sys.path.append(os.path.join(
    os.path.dirname(__file__),
    os.pardir,
    "cpp",
))
import binaries


# Rewrite a debug file name (or list of them) into its .build-id/...
# name for publication, collecting the mappings in the `manifest` dict.
def rewrite(debug, manifest):
    if isinstance(debug, list):
        return [rewrite(x, manifest) for x in debug]
    id_path = binaries.get_sdk_debug_path(debug)
    manifest[id_path] = debug
    return id_path

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--input', help='Input JSON file', required=True)
    parser.add_argument('--output', help='Output JSON file', required=True)
    parser.add_argument('--manifest', help='Output manifest file',
                        required=True)
    parser.add_argument('--location', help='JSON pointer', required=True)
    args = parser.parse_args()

    # Read in the original JSON tree.
    with open(args.input) as f:
        data = json.load(f)

    # Poor man's JSON pointer: /foo/bar/baz looks up in dicts.
    ptr = args.location.split('/')
    assert ptr[0] == '', '%s should be absolute JSON pointer' % args.location

    # Follow the pointer steps until the last one, so walk[ptr[0]] points
    # at the requested location in the JSON tree.
    walk = {'': data}
    while len(ptr) > 1:
        walk = walk[ptr[0]]
        ptr = ptr[1:]

    # Apply the rewrites to the string or list at that spot in the tree.
    manifest = {}
    walk[ptr[0]] = rewrite(walk[ptr[0]], manifest)

    # Write out the manifest collected while rewriting original debug files
    # names to .build-id/... names for publication.
    with open(args.manifest, 'w') as f:
        for dest, source in manifest.iteritems():
            f.write('%s=%s\n' % (dest, source))

    # Write out the modified JSON tree.
    with open(args.output, 'w') as f:
        json.dump(data, f, indent=2, sort_keys=True)

    return 0


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