from typing import Text
from moviepy.editor import *
import os
import sys
import re 
import xml.etree.ElementTree as ET
import collections
import datetime as dt
import math
import html
from datetime import datetime
import urllib
from bs4 import BeautifulSoup


from requests.models import requote_uri
########### import upload_video
import requests


credits_duration = 3

#duration of silence after each audio clip
post_audio_duration = 2

folder_base = sys.argv[1] + "/"
folder_name = sys.argv[1] + "/mobile/"

def get_title(element):
    for x in element:
        if x.tag == "Title":
            return x.text
    return None

def get_code(element):
    for x in element:
        if x.tag == "ModuleID":
            return x.text
    return None

def flatten(x):
    if len(x) > 0:
        return [a for i in x for a in flatten(i)]
    else:
        return [x]



def cleanhtml(raw_html):
  cleanr = re.compile('<.*?>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});')
  cleantext = re.sub(cleanr, '', raw_html)
  return cleantext

def get_link_no_html(link_to_encode):
    encoded_link = urllib.parse.quote(link_to_encode)
    r = requests.get(f'https://m.x-plain.com/Android/strip_tags.php?u={encoded_link}&submit=submit', verify=False)
    return r

def get_tutorial_text(tut_id):
    r = get_link_no_html("https://peicontent.x-plain.com/client/he2_content2.asp?m=" + tut_id)
    if(r.status_code == 200):
        soup = BeautifulSoup(r.text)
        return str(soup.get_text().encode('utf-8').decode())
    else:
        return None

def get_tutoral_overview(tut_id, lang):
    # r = get_link_no_html(f"https://peicontent.x-plain.com/client/HE2m_Overview.asp?m={tut_id}&l={lang}")
    r = requests.get(f"https://peicontent.x-plain.com/client/YT_Overview.asp?m={tut_id}&l={lang}" , verify=False )
    if(r.status_code == 200):
        # soup = BeautifulSoup(r.text)
        return r.text.replace("Overview","")
        # return str(soup.get_text().encode('utf-8'))
    else:
        return None

def get_tutorial_keywords(tut_id):
    r = requests.get(f"https://peicontent.x-plain.com/client/ws_synonym.asp?m={tut_id}")
    if(r.status_code == 200):
        # soup = BeautifulSoup(r.text)
        print( tut_id + ' tags: ' + r.text  )
        return r.text
    else:
        return None

def slide_file_name(element):
    filename = folder_name + "slides/m_"
    filename += element.attrib['f']
    #if('s' in element.attrib):
    #    filename += "_S"
    if('a' in element.attrib and not ('s' in element.attrib)):
        filename += ".gif"
    else:
        filename += ".png"
    return filename


def audio_file_name(element):
    filename = folder_name + "sound/m_s" + element.attrib['f']
    filename += ".mp3"
    return filename


timestamp_list = []
running_duration_counter = 0.0

def process_for_timestamp(element):
    if('s' in element.attrib):
        m, s = divmod(running_duration_counter, 60)
        h, m = divmod(m, 60)
        if(h == 0 and m == 0 and s ==0):
            pass
        else:
            s+=1

        stamp = ""
        if(h > 0):
            stamp += f'{h}:'
        stamp += f'{int(m):02d}:{int(s):02d}'
        stamp += " - " + element.attrib['s'] + " "
        timestamp_list.append(stamp)
        
def write_timestamps():
    stamps = '\n' + '\n'.join(timestamp_list)
    output_file = open( folder_base + "output.txt", "w")
    soup = BeautifulSoup(stamps)
    output_file.write(str(soup.get_text().encode('utf-8')))
    output_file.close()
    return str(soup.get_text().encode('utf-8').decode())



def process_for_timestamp_END():
    m, s = divmod(running_duration_counter, 60)
    h, m = divmod(m, 60)
    if(h == 0 and m == 0 and s ==0):
        pass
    else:
        s+=1

    stamp = ""
    if(h > 0):
        stamp += f'{h}:'
    stamp += f'{int(m):02d}:{int(s):02d}'
    stamp += " - End "
    timestamp_list.append(stamp)
    



tree = ET.parse(folder_name +  "A2.xml")
root = tree.getroot()

infonode = root[0]


nodelist = root[1:-1]
nodelist_flat = flatten(nodelist)

for item in nodelist_flat:
    print(item.attrib['f'])




videoclips = []
for node in nodelist_flat:
    if((node.attrib['p']=='s' or node.attrib['p']=='o') and node.tag=='s'):
    	process_for_timestamp(node)
    	print(audio_file_name(node))
    	audio = AudioFileClip(audio_file_name(node))
    	slide_duration = audio.duration + post_audio_duration
    	running_duration_counter += ( slide_duration - 0.5 )
    	newclip = ImageClip(slide_file_name(node), duration=slide_duration)
    	newclip = newclip.set_audio(audio)
    	videoclips.append(newclip)

process_for_timestamp_END()
print("END")
audio = AudioFileClip("common/end.mp3")
slide_duration = audio.duration - 0.5 
running_duration_counter += slide_duration + post_audio_duration + 30
newclip = ImageClip( "common/end.png", duration=slide_duration )
newclip = newclip.set_audio(audio)
videoclips.append(newclip)






title = get_title(infonode)
code = get_code(infonode)
tags = get_tutorial_keywords(sys.argv[1])

desc_file = open(  folder_base + "desc.txt", "w", encoding='utf-8')
desc_file.write( "\n" + get_tutoral_overview(code,1).replace("b'", " ") + '\n\nSections:\n' + write_timestamps() )
desc_file.close()

desc_file = open(  folder_base + "title.txt", "w", encoding='utf-8')
desc_file.write( title )
desc_file.close()

desc_file = open(  folder_base + "tags.txt", "w", encoding='utf-8')
desc_file.write( tags )
desc_file.close()


filename =  folder_base + code + ".mp4"
args = {
    "file": filename,
    "title":get_title(infonode),
    "description": "\n" + get_tutoral_overview(code, 1).replace("b'", " ") + "\n" + write_timestamps(),
    "category": "27",
    "keywords": tags ,
    "privacyStatus": "unlisted",
    "logging_level":'DEBUG',
    "noauth_local_webserver":"true"

}

class Bunch(object):
  def __init__(self, adict):
    self.__dict__.update(adict)



final_clip = concatenate_videoclips(videoclips)
final_clip.write_videofile( folder_base + get_code(infonode) + ".mp4", fps=24)



desc_file = open(  folder_base + "completed.txt", "w", encoding='utf-8')
desc_file.write( datetime.now() )
desc_file.close()



######## upload_video.do_upload(Bunch(args))

#audio = AudioFileClip("sound/m_s1_0.mp3")
#slide = ImageClip("slides/m_1_0_S.png", duration=audio.duration)

#slide = slide.set_audio(audio)

#slide.write_videofile("output.mp4", fps=24)

