#! /usr/bin/env python3
"""Find imports in python files"""

import linecache
import texter

from pysyte import imports
from pysyte.cli.main import run


def add_args(parser):
    """Parse out command line arguments"""
    parser.string('source', help='path to source(s) to be checked')
    parser.boolean('', 'edit', help='Show a command for editing')
    parser.boolean('', 'duplicate', help='Show duplicate imports')
    parser.boolean('', 'unused', help='Show unused imports')
    return parser


class TextVisitor(object):

    def __init__(self, visitor):
        self.visitor = visitor

    def text(self, line):
        string = '% 4d: %s' % (
            line,
            linecache.getline(self.visitor.path, line)
        )
        return string.rstrip()


def show_unused(visitor):
    unused_lines = sorted(visitor.unused_lines())
    if not unused_lines:
        return []
    text = texter(visitor)
    print('Unused:')
    for line in unused_lines:
        names_string = ','.join(unused_lines[line])
        print(f'{names_string}\n{visitor.line(line, True)}')
    return visitor.unused().keys()


def show_duplicates(visitor):
    multiples = visitor.multiples()
    if multiples:
        print('Duplicates:')
    for name, lines in multiples.items():
        instances = [visitor.line(_, True) for _ in lines]
        lines = [name] + instances
        print('\n'.join(lines))
    return multiples.keys()


def main(args):
    visitor = imports.extract_imports(args.source)
    modules = []
    if args.duplicate:
        modules.extend(show_duplicates(visitor))
    if args.unused:
        modules.extend(show_unused(visitor))
    if args.edit and modules:
        sought = r'\>\|\<'.join(modules)
        print(f'\nvim {visitor.path} +/"\\<{sought}\\>"')
    return bool(modules)


run(main, add_args=add_args)
