# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

from __future__ import absolute_import, print_function, unicode_literals

import argparse
import subprocess
import sys
import os

def parse_outputs(crate_output, dep_outputs, pass_l_flag):
    env = {}
    args = []

    def parse_line(line):
        if line.startswith('cargo:'):
            return line[len('cargo:'):].split('=', 1)

    def parse_file(f):
        with open(f) as fh:
            return [parse_line(line.rstrip()) for line in fh.readlines()]

    for f in dep_outputs:
        for entry in parse_file(f):
            if not entry:
                continue
            key, value = entry
            if key == 'rustc-link-search':
                args += ['-L', value]
            elif key == 'rustc-flags':
                flags = value.split()
                for flag, val in zip(flags[0::2], flags[1::2]):
                    if flag == '-l' and f == crate_output:
                        args += ['-l', val]
                    elif flag == '-L':
                        args += ['-L', val]
                    else:
                        raise Exception('Unknown flag passed through '
                                        '"cargo:rustc-flags": "%s"' % flag)
            elif key == 'rustc-link-lib' and f == crate_output:
                args += ['-l', value]
            elif key == 'rustc-cfg' and f == crate_output:
                args += ['--cfg', value]
            elif key == 'rustc-env' and f == crate_output:
                env_key, env_value = value.split('=', 1)
                env[env_key] = env_value
            elif key == 'rerun-if-changed':
                pass
            elif key == 'rerun-if-env-changed':
                pass
            elif key == 'warning':
                pass
            elif key:
                # Todo: Distinguish between direct and transitive
                # dependencies so we can pass metadata environment
                # variables correctly.
                pass

    return env, args

def wrap_rustc(args):
    parser = argparse.ArgumentParser()
    parser.add_argument('--crate-out', nargs='?')
    parser.add_argument('--deps-out', nargs='*')
    parser.add_argument('--cwd')
    parser.add_argument('--pass-l-flag', action='store_true')
    parser.add_argument('--cmd', nargs=argparse.REMAINDER)
    args = parser.parse_args(args)

    new_env, new_args = parse_outputs(args.crate_out, args.deps_out,
                                      args.pass_l_flag)
    os.environ.update(new_env)
    return subprocess.Popen(args.cmd + new_args, cwd=args.cwd).wait()

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