#!/usr/bin/env python

import argparse
import sys

import mrep.builder
import mrep.pattern
import mrep.morph
import mrep.printer


def run(f, parser, printer, show_line_number):
    for i, s in enumerate(f):
        ms = parser.parse(s)
        results = mrep.pattern.find(ms, matcher)
        if len(results) == 0:
            continue

        if show_line_number:
            sys.stdout.write('%d:' % (i + 1))
        printer.print_result(ms, results, sys.stdout)


def select_color(color):
    if args.color == 'never':
        is_color_mode = False
    elif args.color == 'always':
        is_color_mode = True
    elif args.color == 'auto':
        is_color_mode = sys.stdout.isatty()

    if is_color_mode:
        ESCAPE = '\033[%sm'
        RED = ESCAPE % '31'
        ENDC = ESCAPE % '0'
        return (RED, ENDC)
    else:
        return ('', '')


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description='MREP: morpheme regular expression printer')
    parser.add_argument('pattern', metavar='PATTERN',
                        nargs='?', help='pattern')
    parser.add_argument('file', metavar='FILE',
                        nargs='*', help='data file')
    parser.add_argument('-o', '--only-matching', action='store_true',
                        help='print only matching')
    parser.add_argument('--color', type=str,
                        choices=['never', 'auto', 'always'],
                        default='auto',
                        help='color mode. select from "never", "auto" and '
                        '"always". (default: auto)')
    parser.add_argument('-n', '--line-number', action='store_true',
                        help='Show line number')
    parser.add_argument('--mecab-arg', type=str, default='',
                        help='argument to pass to mecab '
                        '(ex: "-r /path/to/resource/file")')
    parser.add_argument('--version', action='store_true',
                        help='show version number')
    args = parser.parse_args()

    if args.version:
        sys.stdout.write('mrep %s\n' % mrep.__version__)
        sys.exit(0)

    if args.pattern is None:
        parser.print_usage()
        sys.stdout.write('mrep: error: PATTERN is required\n')
        sys.exit(2)

    try:
        matcher = mrep.builder.parse(args.pattern)
    except mrep.builder.ParseError as e:
        sys.stderr.write('%s (@%d)\n' % (str(e), e.pos))
        sys.exit(3)

    (color_begin, color_end) = select_color(args.color)

    if args.only_matching:
        printer = mrep.printer.OnlyMatchPrinter(color_begin, color_end)
    else:
        printer = mrep.printer.Printer(color_begin, color_end)

    try:
        parser = mrep.morph.MeCabParser(args.mecab_arg)
    except Exception as e:
        sys.stderr.write('Fail to initialize MeCab\n')
        sys.stderr.write('%s\n' % e)
        sys.exit(4)

    if len(args.file) > 0:
        for file in args.file:
            try:
                with open(file) as f:
                    run(f, parser, printer, args.line_number)
            except IOError as e:
                sys.stderr.write('%s\n' % e)
    else:
        run(sys.stdin, parser, printer, args.line_number)
