#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright © 2010 University of Zürich
# Author: Rico Sennrich <sennrich@cl.uzh.ch>
# For licensing information, see LICENSE


from __future__ import division, print_function
import sys
import os
import getopt

def usage():
    bold = "\033[1m"
    reset = "\033[0;0m"
    italic = "\033[3m"

    print('\n\t All files need to be one sentence per line and have .EOA as a hard delimiter. --source, --target and --output are mandatory arguments, the others are optional.')
    print('\n\t' + bold +'--help' + reset + ', ' + bold +'-h' + reset)
    print('\t\tprint usage information\n')
    print('\t' + bold +'--source' + reset + ', ' + bold +'-s' + reset + ' file')
    print('\t\tSource language text.')
    print('\t' + bold +'--target' + reset + ', ' + bold +'-t' + reset + ' file')
    print('\t\tTarget language text.')
    print('\t' + bold +'--output' + reset + ', ' + bold +'-o' + reset + ' filename')
    print('\t\tOutput file: Will create ' + 'filename' + '-s and ' + 'filename' + '-t')
    print('\n\t' + bold +'--srctotarget' + reset + ' file')
    print('\t\tTranslation of source language text to target language. Needs to be sentence-aligned with source language text.')
    print('\t' + bold +'--targettosrc' + reset + ' file')
    print('\t\tTranslation of target language text to source language. Needs to be sentence-aligned with target language text.')
    print('\n\t' + bold +'--factored' + reset)
    print('\t\tSource and target text can be factored (as defined by moses: | as separator of factors, space as word separator). Only first factor will be used for BLEU score.')
    print('\n\t' + bold +'--filter' + reset + ', ' + bold +'-f' + reset + ' option')
    print('\t\tFilters output. Possible options:')
    print('\t\t' + bold +'sentences' + reset + '\tevaluate each sentence and filter on a per-sentence basis')
    print('\t\t' + bold +'articles' + reset + '\tevaluate each article and filter on a per-article basis')
    print('\n\t' + bold +'--filterthreshold' + reset + ' int')
    print('\t\tFilters output to best XX percent. (Default: 90). Only works if --filter is set.')
    print('\t' + bold +'--bleuthreshold' + reset + ' float')
    print('\t\tFilters out sentence pairs with sentence-level BLEU score < XX (in range from 0 to 1). (Default: 0). Only works if --filter is set.')
    print('\t' + bold +'--filterlang' + reset)
    print('\t\tFilters out sentences/articles for which BLEU score between source and target is higher than that between translation and target (usually means source and target are in same language). Only works if --filter is set.')
    print('\n\t' + bold +'--bleu_n' + reset + ' int')
    print('\t\tConsider n-grams up to size n for BLEU. Default 2.')
    print('\t' + bold +'--bleu_charlevel' + reset)
    print('\t\tPerform BLEU on charcter-level (recommended for continuous script language; also consider increasing bleu_n).')
    print('\n\t' + bold +'--galechurch' + reset)
    print('\t\tAlign the bitext using Gale and Church\'s algorithm (without BLEU comparison).')
    print('\t' + bold +'--printempty' + reset)
    print('\t\tAlso write unaligned sentences to file. By default, they are discarded.')
    print('\t' + bold +'--verbosity' + reset + ', ' + bold +'-v' + reset + ' int')
    print('\t\tVerbosity. Choose amount of debugging output. Default value 1; choose 0 for (mostly) quiet mode, 2 for verbose output')
    print('\t' + bold +'--processes' + reset + ', ' + bold +'-p' + reset + ' int')
    print('\t\tNumber of parallel processes. Documents are split across available processes. Default: 4.')

def load_arguments(sysargv):
    try:
        opts, args = getopt.getopt(sysargv[1:], "def:ho:s:t:v:p:", ["factored", "filter=", "filterthreshold=", "bleuthreshold=", "filterlang", "printempty", "deveval","eval", "help", "bleu_n=", "bleu_charlevel", "galechurch", "output=", "source=", "target=", "srctotarget=", "targettosrc=", "verbosity=", "printempty=", "processes="])
    except getopt.GetoptError as err:
        # print help information and exit:
        print(str(err)) # will print something like "option -a not recognized"
        usage()
        sys.exit(2)
    options = {}
    options['srcfile'] = None
    options['targetfile'] = None
    options['output'] = None
    options['srctotarget'] = []
    options['targettosrc'] = []
    options['processes'] = 4
    bold = "\033[1m"
    reset = "\033[0;0m"

    project_path = os.path.dirname(os.path.abspath(__file__))
    for o, a in opts:
        if o in ("-h", "--help"):
            usage()
            sys.exit()
        elif o in ("-e", "--eval"):
            options['srcfile'] = os.path.join(project_path,'eval','eval1989.de')
            options['targetfile'] = os.path.join(project_path,'eval','eval1989.fr')
            from eval import goldeval
            goldalign = [None] * len(goldeval.gold1990map)
            for index, data in list(goldeval.gold1990map.items()):
                goldalign[index] = goldeval.gold[data]
            options['eval'] = goldalign
        elif o in ("-d", "--deveval"):
            options['srcfile'] = os.path.join(project_path,'eval','eval1957.de')
            options['targetfile'] = os.path.join(project_path,'eval','eval1957.fr')
            from eval import golddev
            goldalign = [golddev.goldalign]
            options['eval'] = goldalign
        elif o in ("-o", "--output"):
            options['output'] = a
        elif o == "--factored":
            options['factored'] = True
        elif o in ("-f", "--filter"):
            if a in ['sentences','articles']:
              options['filter'] = a
            else:
              print('\nERROR: Valid values for option ' + bold + '--filter'+ reset +' are '+ bold +'sentences '+ reset +'and ' + bold +'articles'+ reset +'.')
              usage()
              sys.exit(2)
        elif o == "--filterthreshold":
            options['filterthreshold'] = float(a)
        elif o == "--bleuthreshold":
            options['bleuthreshold'] = float(a)
        elif o == "--filterlang":
            options['filterlang'] = True
        elif o == "--galechurch":
            options['galechurch'] = True
        elif o == "--bleu_n":
            options['bleu_ngrams'] = int(a)
        elif o == "--bleu_charlevel":
            options['bleu_charlevel'] = True
        elif o in ("-s", "--source"):
            if not 'eval' in options:
                options['srcfile'] = a
        elif o in ("-t", "--target"):
            if not 'eval' in options:
                options['targetfile'] = a
        elif o == "--srctotarget":
            if a == '-':
                options['no_translation_override'] = True
            else:
                options['srctotarget'].append(a)
        elif o == "--targettosrc":
            options['targettosrc'].append(a)
        elif o == "--printempty":
            options['printempty'] = True
        elif o in ("-v", "--verbosity"):
            global loglevel
            loglevel = int(a)
            options['loglevel'] = int(a)
            options['verbosity'] = int(a)
        elif o in ("-p", "--processes"):
            options['num_processes'] = int(a)
        else:
            assert False, "unhandled option"

    if not options['output']:
      print('WARNING: Output not specified. Just printing debugging output.',0)
    if not options['srcfile']:
      print('\nERROR: Source file not specified.')
      usage()
      sys.exit(2)
    if not options['targetfile']:
      print('\nERROR: Target file not specified.')
      usage()
      sys.exit(2)
    if options['targettosrc'] and not options['srctotarget']:
        print('\nWARNING: Only --targettosrc specified, but expecting at least one --srctotarget. Please swap source and target side.')
        sys.exit(2)
    if not options['srctotarget'] and not options['targettosrc']\
          and 'no_translation_override' not in options:
        print("ERROR: no translation available: BLEU scores can be computed between the source and target text, but this is not the intended usage of Bleualign and may result in poor performance! If you're *really* sure that this is what you want, use the option '--srctotarget -'")
        sys.exit(2)
    return options
