#!/usr/bin/env python3
"""
collect-exports module1 module2...

Collect all exports in the specified modules and generate "from foo import
..." lines for public members defined in those modules.

Print the result to stdout.

"""

# pyflyby/collect-exports
# Copyright (C) 2011, 2012, 2013, 2014 Karl Chen.
# License: MIT http://opensource.org/licenses/MIT


from __future__ import absolute_import, division, with_statement
from __future__ import print_function

import sys

from   pyflyby._cmdline         import hfmt, parse_args
from   pyflyby._importdb        import ImportDB
from   pyflyby._log             import logger
from   pyflyby._modules         import ModuleHandle


def main():
    def addopts(parser):
        parser.add_option("--ignore-known", default=False, action='store_true',
                          help=hfmt('''
                                Don't list imports already in the
                                known-imports database.'''))
        parser.add_option("--no-ignore-known", dest="ignore_known",
                          action='store_false',
                          help=hfmt('''
                                (Default) List all imports, including those
                                already in the known-imports database.'''))
        parser.add_option("--expand-known", default=False, action='store_true',
                          help=hfmt('''
                                Scan all modules mentioned in known-imports
                                database.'''))
        parser.add_option("--no-expand-known", dest="expand_known",
                          action='store_false',
                          help=hfmt('''
                                (Default) Scan only modules listed explicitly
                                on the command line.'''))
    options, args = parse_args(addopts, import_format_params=True)
    if options.expand_known:
        db = ImportDB.get_default(".")
        known = db.known_imports.imports
        args += sorted(set(
                [_f for _f in [i.split.module_name for i in known] if _f]))
    bad_module_names = []
    for module_name in args:
        module = ModuleHandle(module_name)
        try:
            imports = module.exports
        except Exception as e:
            logger.warning("couldn't get exports for %s; ignoring: %s: %s",
                           module, type(e).__name__, e)
            bad_module_names.append(module_name)
            continue
        if not imports:
            continue
        if options.ignore_known:
            db = ImportDB.get_default(module.__file__)
            imports = imports.without_imports(db)
        sys.stdout.write(imports.pretty_print(
                allow_conflicts=True, params=options.params))
    if bad_module_names:
        print("collect-exports: there were problems with: %s" % (
            ' '.join(bad_module_names)), file=sys.stderr)
        sys.exit(1)


if __name__ == '__main__':
    main()
