#!/usr/bin/env python

import os
import re
from fire import Fire
from functools import partial

from traxix.trixli.utils import _f, _match_all, _compile_re, colorize


def functor(compiled_re, ml, path):
    if not os.path.isfile(path):
        return
    with open(path, "r") as fp:
        line_number = 1
        try:
            for line in fp:
                if _match_all(string=line, regexps=compiled_re):
                    line = colorize(line.strip(), compiled_re)
                    response = f"{path}:{line_number}> {line}"
                    print(response[:ml])
        except UnicodeDecodeError as error:
            pass


def fr(*regexps, e=None, p=".", ml: int = 200):
    """
    Equivalent to find $p -name "*\.$e" -exec grep -nH $regexps '{}' \;
    but shorter and allow multiple regexps

    Args
    e: extension of files
    p: path from where to walk
    ml: max line length
    """
    if e:
        e = e + "$"
    else:
        e = ".*"

    compiled_re = [re.compile("(" + str(regexp) + ")") for regexp in regexps]

    _f(e, p=p, functor=partial(functor, compiled_re=compiled_re, ml=ml))


if __name__ == "__main__":
    Fire(fr)
