import fitz
from datetime import datetime
import PyPDF2
import os
import subprocess
from subprocess import Popen
# from narration.vectorcode.code.functions import ScriptBreakdown
from .detection import language_detector
from conversion.translation.script_reading import breaksen, getRefined, getSlugAndNonSlug, getSpeakers, getScenes
from conversion.translation.script_writing import addSlugLine, addActionLine, addSpeaker, addParenthetical, addDialogue, dual_script, addTransition, dial_checker,  non_dial_checker
from conversion.translation.translation_function import translate_comparison, ui_option3_and_4, convert_to_pdf
from conversion.translation.translation_variables import get_doc_file, get_pdf_save_dir, is_in_translation_list, get_language_script_code
from conversion.translation.final_transliteration_only import makeTransliteration_only
from conversion.translation.translation_resources import google
from MNF.settings import BasePath
from page_script.models import MNFScriptDatabase_2, Conversions, Conversion_link
from mnfapp.models import MNFScriptDatabase, ScriptTranslations
from tqdm import tqdm
import docx
basePath = BasePath()


def translate_function(script_path, script_id, translation_id, dial_src_lang, action_line_src_lang, dial_src_script, restrict_to_five, option3, option4, option5, option6, centralised="no",sample_id="0000",sample_title=""):
    # -> These are Global Booleans Variables
    is_action_line_translation_required = False
    is_action_line_transliteration_required = False
    is_dialogue_translation_required = False
    is_dialogue_transliteration_required = False

    # -> Extracting information from DB
    if centralised == "yes":
        z = Conversion_link.objects.get(
            script_name=MNFScriptDatabase_2.objects.get(script_id=script_id))
        objs = z.conversions.all()
        for indx, obji in enumerate(objs):
            if indx == len(objs) - 1:
                obj = obji
            else:
                pass
        action_line_dest_lang = obj.nondial_dest_language
        dial_dest_lang = obj.dial_dest_language
        dual_dial_script = obj.dual_dial_script
        dial_dest_script = obj.dial_dest_script
        action_line_src_script = obj.nondial_src_script
        action_line_dest_script = obj.nondial_dest_script
        data = [str(MNFScriptDatabase_2.objects.get(script_id=script_id).user_id), str(
            MNFScriptDatabase_2.objects.get(script_id=script_id).script_name), str(script_id), str(dial_src_lang)]
    else:
        try:
            translation_instance = ScriptTranslations.objects.get(translation_id = str(translation_id))
            dial_dest_lang = translation_instance.dial_dest_language
            dial_dest_script = translation_instance.dial_dest_script
            action_line_dest_lang = translation_instance.nondial_dest_language
            action_line_dest_script = translation_instance.nondial_dest_script
        except:
            pass
        user_script_data = MNFScriptDatabase.objects.get(
            script_id=str(script_id))
        # action_line_dest_lang = user_script_data.nondial_dest_language
        # dial_dest_lang = user_script_data.dial_dest_language
        dual_dial_script = translation_instance.dual_dial_script
        # dial_dest_script = user_script_data.dial_dest_script
        action_line_src_script = user_script_data.nondial_src_script
        # action_line_dest_script = user_script_data.nondial_dest_script
        data = [user_script_data.dial_src_language, user_script_data.nondial_src_language, action_line_dest_lang, user_script_data.dial_src_script, translation_instance.dial_dest_script, user_script_data.nondial_src_script,translation_instance.nondial_dest_script]

    # -> Creating Doc instance
    doc = docx.Document()
    doc_file = get_doc_file(dial_dest_lang, script_path, sample_id,sample_title, centralised, data)
    original_script_path = script_path
    print("Doc Name: ", doc_file)
    original_doc_file_name = doc_file
    print("get_language_script_code(dial_src_lang)-> ",
          get_language_script_code(dial_src_lang))
    print("dial_src_script->", dial_src_script)

    # -> Setting of Global Variables (dial_src_script is average of scripts of all languages and same
    # for action_line_src_script)

    if dial_src_lang != dial_dest_lang and dial_src_script != get_language_script_code(dial_src_lang):
        is_dialogue_transliteration_required = True
    if action_line_src_lang != action_line_dest_lang and action_line_src_script != get_language_script_code(
            action_line_src_lang):
        is_action_line_transliteration_required = True
    if action_line_src_lang != action_line_dest_lang:
        is_action_line_translation_required = True
    if dial_src_lang != dial_dest_lang:
        is_dialogue_translation_required = True

    # -> This Transliteration will transliterate only when the script of the dialogues or actionlines is different from
    # the default script of (language of dialogues) (kindof removing transliteration for the translation to happen
    # smoothly if script of dialogues is different from its original default script of dialogues)

    # -> Step one Started
    if is_dialogue_transliteration_required or is_action_line_transliteration_required:
        print("Step one Started")

        kwargs = {
            "dial_dest_script": get_language_script_code(dial_src_lang),
            "dual_dial_script": "No",
            "original_file": script_path,
            "dial_dest_lang": dial_src_lang,
            "is_dialogue_transliteration_required": is_dialogue_transliteration_required,
            "is_action_line_transliteration_required": is_action_line_transliteration_required,
            "action_line_dest_script": get_language_script_code(action_line_src_lang),
            "action_line_src_lang": action_line_src_lang,
            "action_line_src_script": action_line_src_script,
            "restrict_to_five": restrict_to_five
        }
        if len(sample_title) > 2:
            kwargs["ignore_because_sample_script"] = True
        else:
            kwargs["ignore_because_sample_script"] = False
        script_path, scenes_original = makeTransliteration_only(**kwargs)
        print("Step one ended")
    # -> Step one ended
    print(doc_file, "step 1")
    # os.system("cp "+ str(doc_file) + " " + (doc_file.split("."))[0] + "_Step1.docx") -> could be uncommented to
    # check what changes are made to script as file is getting created at this stage

    # -> Step two Translation Started
    if is_dialogue_translation_required or is_action_line_translation_required:
        print("Step two Translation Started")
        refined, total_scenes = getRefined(script_path)
        sluglines, without_slug = getSlugAndNonSlug(refined)
        characters = getSpeakers(without_slug)
        scenes, actionline, parenthetical_lis, speakers, dialogues = getScenes(
            refined, total_scenes, characters)
        print(scenes, "these are the scenes")
        # -> Restriction of Number of scenes to Five if user Wants a Sample of Conversion
        if restrict_to_five == 'yes':
            scenes = scenes[:5]

        # going over each scene and all its dialogues,actionlines, paranthetical lines, transitions for translation
        for scene in tqdm(scenes):
            for i, line in enumerate(scene):
                if i == 0:
                    addSlugLine(doc, line)
                    continue
                if isinstance(line, str):
                    if is_action_line_translation_required:
                        print("in actionline")
                        if is_in_translation_list(action_line_src_lang) and is_in_translation_list(action_line_dest_lang):
                            trans_text = translate_comparison(
                                line, action_line_src_lang, action_line_dest_lang)
                            addActionLine(doc, trans_text,
                                          action_line_dest_lang)
                        else:
                            addActionLine(doc, line, action_line_dest_lang)
                    else:
                        print(
                            "Adding actionline without translating:else of is_action_line_translation_required")
                        addActionLine(doc, line, action_line_dest_lang)
                else:
                    [speaker] = line.keys()
                    if speaker == 'Transition':
                        addTransition(doc, line[speaker])
                        continue
                    addSpeaker(doc, speaker)
                    if is_dialogue_translation_required:
                        dial_lang = language_detector(line[speaker][2])
                        print("dial_lang", dial_lang)

                        # paranthetical line Case
                        if line[speaker][0] != 'NONE':
                            par_lang = language_detector(line[speaker][0])
                            if dial_dest_lang == par_lang:
                                out = line[speaker][0]
                            else:
                                out = google(
                                    line[speaker][0], par_lang, dial_dest_lang)
                            addParenthetical(doc, out)

                        # only dialogues
                        if line[speaker][2] == "":
                            continue
                        if dial_lang == action_line_src_lang:
                            ui_option3_and_4(doc,
                                             dial_lang, dial_dest_lang, line[speaker][2], option3, "No")

                        elif dial_lang != action_line_src_lang and dial_lang != dial_dest_lang:
                            print("in case ui4")
                            ui_option3_and_4(
                                doc, dial_lang, dial_dest_lang, line[speaker][2], option4, "No")

                    # To be ran when option 5 and 6 are yes(i.e. some word in whole dialogue has different language)
                    # elif dial_src_lang == dial_dest_lang:
                    #     print("in case ui5_and_6")
                    #     ui_option5_and_6(
                    #         dial_src_lang, dial_dest_lang, line[speaker][2])

                    else:
                        if line[speaker][0] != 'NONE':
                            print("else mein hain")
                            addParenthetical(doc, line[speaker][0])
                        addDialogue(doc, line[speaker][2], dial_dest_lang)
        doc.save(doc_file)
        if is_dialogue_translation_required:
            dial_src_script = get_language_script_code(dial_dest_lang)
        if 'scenes_original' not in locals():
            scenes_original = scenes
        print("Step two translation ended")
    # -> Step two translation ended
    print(doc_file, "step 2")
    # os.system("cp "+ str(doc_file) + " " + (doc_file.split("."))[0] + "_Step2.docx") -> could be uncommented to
    # check what changes are made to script as file is getting created at this stage

    # -> Step three transliteration Started
    action_line_src_script = get_language_script_code(
            action_line_dest_lang)
    #action_line_dest_script = "Latin"
    print("uiop hui", action_line_src_script, action_line_dest_script)
    if dial_src_script != dial_dest_script or action_line_src_script != action_line_dest_script:
        kwargs = {
            "dial_dest_script": dial_dest_script,
            "dual_dial_script": "No",
            "dial_dest_lang": dial_src_lang,
            "is_dialogue_transliteration_required": False,
            "is_action_line_transliteration_required": False,
            "action_line_src_script":action_line_src_script,
            "action_line_src_lang": action_line_dest_lang,

        }
        if len(sample_title) > 2:
            kwargs["ignore_because_sample_script"] = True
        else:
            kwargs["ignore_because_sample_script"] = False
        if dial_src_script != dial_dest_script:
            kwargs["is_dialogue_transliteration_required"] = True
        if action_line_src_script != action_line_dest_script:
            kwargs["is_action_line_transliteration_required"] = True
            kwargs["action_line_dest_script"] = action_line_dest_script
        # -> This the case when only Transliteration is required and step one and two were not ram
        if 'scenes_original' not in locals():
            print("yeh if mein gaya issliye change hogaya")
            kwargs["original_file"] = script_path
            doc_file, scenes_original = makeTransliteration_only(**kwargs)
        else:
            print("yeh else mein gaya issliye change hogaya")
            print(doc_file)
            kwargs["original_file"] = doc_file
            doc_file, scenes_final = makeTransliteration_only(**kwargs)
        print("Step three transliteration Ended")
    print(doc_file, "step 3")
    # os.system("cp "+ str(doc_file) + " " + (doc_file.split("."))[0] + "_Step3.docx") -> could be uncommented to
    # check what changes are made to script as file is getting created at this stage

    # -> Step three transliteration Ended

    # -> Step four dual-dialogue Started
    kwargs = {
        "dial_dest_script": dial_dest_script,
        "dual_dial_script": dual_dial_script,
        "original_file": doc_file,
        "dial_dest_lang": dial_src_lang,
        "is_dialogue_transliteration_required": False,
        "is_action_line_transliteration_required": False,
        "action_line_dest_script": get_language_script_code(action_line_src_lang),
        "action_line_src_lang": action_line_src_lang,
        "action_line_src_script": action_line_src_script,
        "scenes_original": scenes_original,
    }
    if len(sample_title) > 2:
        kwargs["ignore_because_sample_script"] = True
    else:
        kwargs["ignore_because_sample_script"] = False
    doc_file, scenes_final = makeTransliteration_only(**kwargs)
    # os.system("cp "+ str(doc_file) + " " + (doc_file.split("."))[0] + "_Step4.docx")# -> could be uncommented to
    # check what changes are made to script as file is getting created at this stage
    print(doc_file, "step 4")
    print("Step four dual-dialogue Ended")
    # Step four dual-dialogue Ended

    # -> Here Goes the Saving of File
    # -> For Scriptpage Conversion Storing
    if centralised == "yes":
        if (obj != None):
            doc_file = doc_file[1:]
            folders_path = ""
            for ii in (doc_file.split("/"))[:-1]:
                folders_path = folders_path + "/" + str(ii)
            convert_to_pdf(str(doc_file), str(folders_path))
            pathspecific = ""
            for i in (doc_file.split('.'))[:-1]:
                pathspecific = pathspecific + "." + str(i)
            saveFile = pathspecific + ".pdf"
            obj.translated_script_path = saveFile.split('MNF')[1]
            obj.save()
            print("saved done go to ")
            return saveFile
        else:
            log.info("Entry for script id in Centralised Database not found")
    else:
        if (translation_instance != None):
            if len(sample_title) > 2:
                print(sample_title)
                print(doc_file)

                print("convert to pdf called", "and it is inside sample script translations")
                convert_to_pdf(doc_file, rf'{basePath}/media/scripts/sample_script_translations/{sample_title}/')
                # os.remove(doc_file)
                saveFile = doc_file.split('.')[0] + ".pdf"
                translation_instance.translated_script_path = saveFile.split('MNF')[1]
                translation_instance.save()
                return saveFile
            convert_to_pdf(doc_file, get_pdf_save_dir())
            saveFile = doc_file.split('.')[0] + ".pdf"
            translation_instance.translated_script_path = saveFile.split('MNF')[1]
            translation_instance.save()
            print("saved done go to ")
            return saveFile
        else:
            log.info("Entry for script id not found")