import os
import re

from translate_help import HelpTranslationJob
from common import TranslationJob, nice_mkdir, nice_path_join

class LevelTranslationJob(TranslationJob):
    def __init__(self, **kwargs):
        TranslationJob.__init__(self, **kwargs)
        self.template_file = kwargs['template_file']
        self.language_files = kwargs['language_files']
        self.line_buffer = None

    def process_file(self):
        while True:
            line = self.read_input_line()
            if not line:
                break

            # English version is always written
            self.write_output_line(line.text)

            match = re.match(r'^(Title|Resume|ScriptName)\.E(.*)', line.text)
            if match:
                for language_file in self.language_files:
                    self.add_translated_line(match, line.occurrence, language_file)

    def add_translated_line(self, command_match, occurrence, language_file):
        command = command_match.group(1)
        arguments = command_match.group(2)

        translated_arguments = arguments
        for attribute_match in re.finditer('(text|resume)="([^"]*)"', arguments):
            whole_attribute_match = attribute_match.group(0)
            attribute = attribute_match.group(1)
            text = attribute_match.group(2)

            self.template_file.insert_entry(text, occurrence, command + '-' + attribute)

            translated_arguments = translated_arguments.replace(
                whole_attribute_match,
                u'{0}="{1}"'.format(attribute, language_file.translate(text)))

        self.write_output_line(u'{0}.{1}{2}'.format(
                command,
                language_file.language_char(),
                translated_arguments))


"""
    Create jobs for chapter translation

    Assumes that input_dir has structure like so:
        ${input_dir}/scene.txt
        ${input_dir}/help/help_file1.txt
        ...
        ${input_dir}/help/help_fileN.txt

    The output files will be saved in:
        ${output_dir}/scene.txt
        ${output_dir}/help/help_file1.${language_char1}.txt
        ...
        ${output_dir}/help/help_fileN.${language_charM}.txt
"""
def create_level_translation_jobs(input_dir, output_dir, template_file, language_files):
    translation_jobs = []

    input_file = os.path.join(input_dir, 'scene.txt')
    translation_jobs.append(LevelTranslationJob(
        input_file     = input_file,
        output_file    = nice_path_join(output_dir, 'scene.txt'),
        template_file  = template_file,
        language_files = language_files))

    input_help_dir = os.path.join(input_dir, 'help')
    if os.path.isdir(input_help_dir):
        output_help_dir = nice_path_join(output_dir, 'help')
        nice_mkdir(output_help_dir)

        language_files_list = []
        if len(language_files) > 0:
            language_files_list = language_files
        else:
            # We need at least one dummy language file to create any jobs
            language_files_list = [None]

        for language_file in language_files_list:
            for help_file in sorted(os.listdir(input_help_dir)):
                if language_file:
                    translated_help_file = help_file.replace('.E.txt', '.{0}.txt'.format(language_file.language_char()))

                translation_jobs.append(HelpTranslationJob(
                    input_file    = os.path.join(input_help_dir, help_file),
                    output_file   = nice_path_join(output_help_dir, translated_help_file),
                    template_file = template_file,
                    language_file = language_file))

    return translation_jobs