import os
import string
import secrets
import chardet
import pysrt
from pysrt import SubRipFile, SubRipItem, SubRipTime
import pysubs2
import re
from fuzzywuzzy import fuzz
import subprocess
from datetime import timedelta
from base import DOWNLOAD_DIR,SUBTITLE_DIR

def detect_encoding(sub_name):
    with open(f'{DOWNLOAD_DIR}{sub_name}', 'rb') as f:
        raw_data = f.read()
    result = chardet.detect(raw_data)
    return result['encoding']

def convert_to_utf8(sub_name, current_encode = 'Cp1256'):
    with open(f'{DOWNLOAD_DIR}{sub_name}', 'r', encoding=current_encode, errors='ignore') as file:
        content = file.read()
    with open(f'{DOWNLOAD_DIR}{sub_name}', 'w', encoding='utf-8') as file:
        file.write(content)

def add_intro(sub_name, task_type: int):
    convert_to_utf8(sub_name)
    try:
        subtitles = pysrt.open(f"{SUBTITLE_DIR}mvo_{sub_name}")
    except:
        os.rename(f"{DOWNLOAD_DIR}{sub_name}",f"{SUBTITLE_DIR}mvo_{sub_name}")
        subtitles = pysrt.open(f"{SUBTITLE_DIR}mvo_{sub_name}")
    first_line_sec = 0
    try:
        first_line_sec = subtitles[0].start.seconds
    except:
        pass
    if first_line_sec >= 10:
        if task_type == 1 or task_type == 5:
            new_sub = pysrt.SubRipItem(index=0, start=pysrt.SubRipTime(0, 0, 2, 0), end=pysrt.SubRipTime(0, 0, 9, 0),text="<font color='#00BFFF'>*نسخه سافت ساب شده توسط موویوبات*\nموویوبات کامل ترین و پیشرفته ترین رسانه دانلود فیلم و سریال\nmovieobot.com</font>")
        elif task_type == 2 or task_type == 6:
            new_sub = pysrt.SubRipItem(index=0, start=pysrt.SubRipTime(0, 0, 2, 0), end=pysrt.SubRipTime(0, 0, 9, 0),text="<font color='#00BFFF'>*نسخه هارد ساب شده توسط موویوبات*\nموویوبات کامل ترین و پیشرفته ترین رسانه دانلود فیلم و سریال\nmovieobot.com</font>")
        subtitles.insert(0, new_sub)
    else:
        min_gap = timedelta(seconds=10)
        intro = False
        for i in range(len(subtitles) - 1):
            current_end = subtitles[i].end
            next_start = subtitles[i + 1].start
            current_end = timedelta(hours=current_end.hours,minutes=current_end.minutes,seconds=current_end.seconds)
            next_start = timedelta(hours=next_start.hours,minutes=next_start.minutes,seconds=next_start.seconds)
            gap = next_start - current_end
            if intro == False:
                if gap >= min_gap:
                    intro = True
                    new_start = current_end + timedelta(seconds=1)
                    new_end = new_start + timedelta(seconds=7)
                    total_seconds = new_start.total_seconds()
                    hours = total_seconds // 3600
                    remaining_seconds = total_seconds % 3600
                    minutes = remaining_seconds // 60
                    seconds = remaining_seconds % 60
                    new_start = pysrt.SubRipTime(hours=hours,minutes=minutes,seconds=seconds)
                    total_seconds = new_end.total_seconds()
                    hours = total_seconds // 3600
                    remaining_seconds = total_seconds % 3600
                    minutes = remaining_seconds // 60
                    seconds = remaining_seconds % 60
                    new_end = pysrt.SubRipTime(hours=hours, minutes=minutes, seconds=seconds)
                    if task_type == 1 or task_type == 5:
                        new_sub = pysrt.SubRipItem(index= i + 1, start=new_start, end=new_end,text="<font color='#00BFFF'>*نسخه سافت ساب شده توسط موویوبات*\nموویوبات کامل ترین و پیشرفته ترین رسانه دانلود فیلم و سریال\nmovieobot.com</font>")
                    elif task_type == 2 or task_type == 6:
                        new_sub = pysrt.SubRipItem(index= i + 1, start=new_start, end=new_end,text="<font color='#00BFFF'>*نسخه هارد ساب شده توسط موویوبات*\nموویوبات کامل ترین و پیشرفته ترین رسانه دانلود فیلم و سریال\nmovieobot.com</font>")
                    subtitles.insert(i + 1, new_sub)
            else:
                break
    subtitles.clean_indexes()
    subtitles.save(f'{SUBTITLE_DIR}mvo_{sub_name}',encoding='utf-8')

def add_outro(sub_name):
    subtitles = pysrt.open(f"{SUBTITLE_DIR}mvo_{sub_name}")
    indexes = len(subtitles)
    current_end = subtitles[indexes-1].end
    current_end = timedelta(hours=current_end.hours, minutes=current_end.minutes, seconds=current_end.seconds)
    new_start = current_end + timedelta(seconds=1)
    new_end = new_start + timedelta(seconds=7)
    total_seconds = new_start.total_seconds()
    hours = total_seconds // 3600
    remaining_seconds = total_seconds % 3600
    minutes = remaining_seconds // 60
    seconds = remaining_seconds % 60
    new_start = pysrt.SubRipTime(hours=hours, minutes=minutes, seconds=seconds)
    total_seconds = new_end.total_seconds()
    hours = total_seconds // 3600
    remaining_seconds = total_seconds % 3600
    minutes = remaining_seconds // 60
    seconds = remaining_seconds % 60
    new_end = pysrt.SubRipTime(hours=hours, minutes=minutes, seconds=seconds)
    new_sub = pysrt.SubRipItem(index=indexes + 1, start=new_start, end=new_end,text='دانلود هزاران فیلم و سریال با دوبله فارسی، زیرنویس چسبیده\nسافت ساب و هارد ساب + پخش آنلاین در موویوبات\nmovieobot.com')
    subtitles.insert(indexes, new_sub)
    subtitles.clean_indexes()
    subtitles.save(f'{SUBTITLE_DIR}mvo_{sub_name}',encoding='utf-8')

def find_ads_in_subtitle(sub_name):
    current_encode = detect_encoding(sub_name)
    if current_encode != 'UTF-8-SIG' and current_encode != 'utf-8':
        if current_encode in ['UTF-16','UTF-32']:
            convert_to_utf8(sub_name,current_encode)
        else:
            convert_to_utf8(sub_name)
    advertising_keywords = ['com','.me','net','ir','ws','best','<د','دیجــــی موویـــــز','سی نما','گرند موویز','baran','us','نایت‌مووی','دیباموویز','بامابین','فلامینگو','@','.bid','بیاتوموویز','فیلامینگو','دیباموویز','مووی کاتیج','دیجی موویز','نایت مووی','سی‌نما','30نما','.co','tvcenter','.top','filamingo','link','cfd','kim','.in','org','.tv','www.','دیجی','30نما','.app','xyz']
    advertising_subs = []
    subtitles = pysrt.open(f"{DOWNLOAD_DIR}{sub_name}")
    deleted_subtitles = pysrt.SubRipFile()
    i = 0
    for sub in subtitles:
        text = sub.text.lower()
        if any(keywords in text for keywords in advertising_keywords):
            deleted_subtitles.append(sub)
            advertising_subs.append(i)
        i += 1
    i = 0
    for sub in subtitles:
        text = sub.text.lower()
        text = re.sub(r'ـ+', '', text)
        text = re.sub(r'[.\s]+', '', text)
        for keywords in advertising_keywords:
            score = fuzz.ratio(text,keywords)
            if score >= 80:
                deleted_subtitles.append(sub)
                advertising_subs.append(i)
        i += 1
    for index in sorted(advertising_subs,reverse=True):
        del subtitles[index]
    subtitles.clean_indexes()
    subtitles.save(f'{SUBTITLE_DIR}mvo_{sub_name}', encoding='utf-8')
    deleted_subtitles.save(f'{SUBTITLE_DIR}deleted_{sub_name}', encoding='utf-8')

def delete_subtitle_line(file_name,index,task_type):
    sub_name = file_name.replace('mvo_', '')
    subtitles = pysrt.open(f"{SUBTITLE_DIR}{file_name}")
    deleted_subtitles = pysrt.open(f"{SUBTITLE_DIR}deleted_{sub_name}")
    sub_line = subtitles[index - 1].text
    deleted_subtitles.insert(index - 1, subtitles[index - 1])
    subtitles.pop(index - 1)
    for idx, sub in enumerate(subtitles):
        sub.index = idx + 1
    subtitles.save(f'{SUBTITLE_DIR}{file_name}', encoding='utf-8')
    deleted_subtitles.save(f'{SUBTITLE_DIR}deleted_{sub_name}', encoding='utf-8')
    if task_type == 2:
        convert_to_ass(file_name.replace('mvo_',''))
    return sub_line

def recover_subtitle_line(file_name,index,task_type):
    sub_name = file_name.replace('deleted_', '')
    deleted_subtitles = pysrt.open(f"{SUBTITLE_DIR}{file_name}")
    for i in range(len(deleted_subtitles)):
        inx = deleted_subtitles[i].index
        if inx == index:
            break
    original_subtitles = pysrt.open(f"{SUBTITLE_DIR}mvo_{sub_name}")
    sub_line = deleted_subtitles[i].text
    original_subtitles.insert(index - 1, deleted_subtitles[i])
    deleted_subtitles.pop(i)
    original_subtitles.clean_indexes()
    original_subtitles.save(f'{SUBTITLE_DIR}mvo_{sub_name}', encoding='utf-8')
    deleted_subtitles.save(f'{SUBTITLE_DIR}{file_name}', encoding='utf-8')
    if task_type == 2:
        convert_to_ass(f'{sub_name}')
    return sub_line

def convert_to_ass(file_name: str):
    subs = pysubs2.load(f'{SUBTITLE_DIR}mvo_{file_name}', encoding="utf-8")
    style = pysubs2.SSAStyle()
    style.fontname = "Vazirmatn"
    style.fontsize = 23
    style.primarycolor = pysubs2.Color(0, 210, 255)
    style.outlinecolor = pysubs2.Color(0, 0, 0)
    style.margin_v = 25
    style.bold = True
    subs.styles["Default"] = style
    ass_file = f"{file_name.replace('.srt','.ass')}"
    subs.save(f'{SUBTITLE_DIR}mvo_{ass_file}')
    return ass_file

def create_movieo_subtitle(sec):
    subs = SubRipFile()
    item = SubRipItem(
        index=1,
        start=SubRipTime(0, 0, 5, 0),
        end=SubRipTime(0, 0, 12, 0),
        text=f"ارائه شده توسط موویوبات\nmovieobot.com"
    )
    subs.append(item)
    seconds = sec - 300
    end_seconds = seconds + 7
    hours = seconds // 3600
    minutes = (seconds % 3600) // 60
    remaining_seconds = seconds % 60
    hours_end = end_seconds // 3600
    minutes_end = (end_seconds % 3600) // 60
    remaining_seconds_end = end_seconds % 60
    item = SubRipItem(
        index=2,
        start=SubRipTime(hours, minutes, remaining_seconds, 0),
        end=SubRipTime(hours_end, minutes_end, remaining_seconds_end, 0),
        text = 'دانلود هزاران فیلم و سریال با دوبله فارسی، زیرنویس چسبیده\nسافت ساب و هارد ساب + پخش آنلاین در موویوبات\nmovieobot.com'
    )
    subs.append(item)
    chars = string.ascii_letters + string.digits
    sub_name = ''.join(secrets.choice(chars) for _ in range(5))
    subs.save(f'{SUBTITLE_DIR}{sub_name}.srt', encoding='utf-8')
    return sub_name