#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
#reload(sys)
import locale
#sys.setdefaultencoding(locale.getpreferredencoding())

import os,getopt,string

filterenable = {}

SHORT_OPTIONS = ""
LONG_OPTIONS = ['help', 'version', 'filters=', 'list']

# processing the command line options

try:
    options, args = getopt.getopt(sys.argv[1:], SHORT_OPTIONS, LONG_OPTIONS)
except getopt.GetoptError as msg:
    print("%s: %s" % (sys.argv[0], msg))
    sys.exit(1)

option_help = 0
option_version = 0
option_list = 0

for (opt, val) in options:
    if opt == '--help':
        option_help = 1
    elif opt == '--version':
        option_version = 1
    elif opt == '--filters':
        for m in val.split(','):
            filterenable[m] = 1
    elif opt == '--list':
        option_list = 1
    
if not args:
    fn = '-'

from KPC import po,poparse,checks

if (option_help):
    helpmsg = [
        'Usage: ko-po-check [옵션]... [파일]...<',
        '      --help                이 도움말을 표시하고 끝납니다',
        '      --version             버전 정보를 표시하고 끝납니다',
        '      --filters=..          필터 직접 지정 (디버깅용)',
        '      --list                필터 목록을 표시합니다 (디버깅용)',
        '',
        ' 파일이 `-\'이거나 파일이 주어지지 않은 경우 표준 입력에서 읽습니다.' ]
    for l in helpmsg:
        print(l)
    sys.exit(1)

if (option_version):
    from KPC.config import VERSION
    print(('ko-po-check %s' % VERSION))
    sys.exit(0)
    
import glob

filenames = glob.glob(os.sep.join(checks.__path__ + ['*', '*.py']))
filters = {}
for filename in filenames:
    if not filename.split(os.sep)[-1].startswith('_'):
        f = {}
        exec(compile(open(filename, 'rb').read(), filename, 'exec'), f)
        if filterenable:
            if f['name'] in filterenable:
                filters[f['name']] = f
        else:
            filters[f['name']] = f

if option_list:
    for name in sorted(filters.keys()):
        try:
            print("%s: %s" % (name, filters[name]['description']))
        except:
            print('BUG: "%s"에 description 필드가 없습니다' % name)
    sys.exit(0)

retval = 0
for fn in args:
    if fn == '-':
        fp = sys.stdin
    else:
        fp = open(fn)

    try:
        catalog = poparse.parse_file(fp)
    except poparse.ParseError as err:
        print(('%s:%d: 파싱 오류' % (fn, err.lineno)))
        sys.exit(1)
    if fn != '-':
        fp.close()

    import re

    for entry in catalog.entries:
        if (not entry.is_translated()):
            continue
        for filtername in sorted(filters.keys()):
            try:
                checker = filters[filtername]['checker']
            except KeyError:
                print('BUG: "%s"에 checker 필드가 없습니다' % filtername)

            errors = checker.check(entry)
            for e in errors:
                print(('%s:%d: %s'%(fn,entry.msgstr_lineno,e.message)))

sys.exit(retval)
