import os.path
import re
import time

from hanziconv import HanziConv
import datetime
from pytube import YouTube
import ssl
import subprocess
import utils.Logger
from dateutil import parser
import base64
import tkinter as tk
# import io
# from PIL import Image

# from dateutil.relativedelta import relativedelta

ssl._create_default_https_context = ssl._create_stdlib_context


def get_screen_resolution():
    try:
        root = tk.Tk()
        screen_width = root.winfo_screenwidth()
        screen_height = root.winfo_screenheight()
        root.destroy()  # 关闭tkinter窗口
        return screen_width, screen_height
    except tk.TclError as e:
        print("无法获取屏幕分辨率:", e)
        return 1920, 1080

def save_base64_image(base64_string, file_path):
    try:
        # 解码base64数据
        image_data = base64.b64decode(base64_string.split(',')[1])

        # 将解码后的数据写入图片文件
        with open(file_path, "wb") as file:
            file.write(image_data)
        # print(f"图片下载成功:{save_path}")
        return True
    except Exception as e:
        print(f"图片下载失败:{file_path}")
        return False


def is_base64_image(url):
    pattern = re.compile(r'^data:image\/[a-z]+;base64,')
    return bool(pattern.match(url))


# 转换 facebook 的时间
def parse_time_string(time_str):
    """

    :param time_str:
    :return:
    """
    # log.debug(f'转换face4book的发布时间:{time_str}')
    if "天" in time_str:
        number = int(time_str.split("天")[0])
        time_delta = datetime.timedelta(days=number)
        return int((datetime.datetime.now() + time_delta).timestamp())
    elif "分钟" in time_str:
        number = int(time_str.split("分钟")[0])
        time_delta = datetime.timedelta(minutes=number)
        return int((datetime.datetime.now() + time_delta).timestamp())
    elif "小时" in time_str:
        number = int(time_str.split("小时")[0])
        time_delta = datetime.timedelta(hours=number)
        return int((datetime.datetime.now() + time_delta).timestamp())
    else:
        try:
            datetime_str = time_str.replace("月", " ").replace("日", "")
            month, day = map(int, datetime_str.split())
            current_year = datetime.datetime.now().year
            datetime_obj = datetime.datetime(year=current_year, month=month, day=day)
            return int(datetime_obj.timestamp())
        except ValueError:
            return None


# 转换 youtube 的时间
def convert_string_to_time(string):
    """

    :param string:
    :return:
    """
    current_time = datetime.now()

    if "天前" in string:
        days = int(string.split("天前")[0])
        converted_time = current_time - datetime.timedelta(days=days)
    elif "周前" in string:
        weeks = int(string.split("周前")[0])
        converted_time = current_time - datetime.timedelta(weeks=weeks)
    elif "月前" in string:
        cleaned_string = re.sub(r'\D', '', string.split("月前")[0])
        months = int(cleaned_string)
        converted_time = current_time - datetime.timedelta(days=months * 30)
    elif "年前" in string:
        years = int(string.split("年前")[0])
        converted_time = current_time - datetime.timedelta(days=years * 365)
    else:
        raise ValueError("Invalid string format")

    timestamp = int(converted_time.timestamp())
    return timestamp


# 转换 twitter 的时间
def parse_twitter_time_string(time_str):
    """

    :param time_str:
    :return:
    """
    times = parser.parse(time_str, fuzzy=True)
    # a = datetime.datetime.strptime(time,"%Y-%m-%d %H:%M:%S")
    b = datetime.datetime.strftime(times, "%Y-%m-%d %H:%M:%S")
    c = time.mktime(time.strptime(b, "%Y-%m-%d %H:%M:%S"))
    # 解析相对时间字符串
    return c


def convert_to_traditional(simplified_text):
    """
    将简体中文文本转换为繁体中文文本。

    Args:
        simplified_text (str): 要转换的简体中文文本。

    Returns:
        str: 转换后的繁体中文文本。
    """
    # converter = opencc.OpenCC('s2t.json')  # 创建简体中文到繁体中文的转换器
    traditional_text = HanziConv.toTraditional(simplified_text)  # 进行转换
    return traditional_text


def pytube_download(link, file_dir):
    """
    下载指定链接的 YouTube 视频并保存到指定目录。

    参数:
    - link: 字符串,YouTube 视频的链接。
    - file_dir: 字符串,视频保存的目录路径。

    返回值:
    - 如果下载成功,则返回 True。
    - 如果下载失败,则返回 False。
    """
    yt = YouTube(link)  # 创建 YouTube 对象
    # yt.register_on_complete_callback(callback)
    yt.streams.filter(progressive=True, file_extension='mp4')  # 过滤指定条件的视频流
    steam = yt.streams.get_by_itag(22)  # 获取指定标签的视频流
    try:
        steam.download(file_dir)  # 下载视频并保存到指定目录
        return True
    except:
        print("下载失败")  # 捕获下载异常并输出错误信息
        return False


def yt_dlp_download(url, name):
    file_dir = os.path.abspath("../")
    network_options = f'-o "{os.path.join(file_dir, "network-assets-reptile", "reptile_data", name, "%(id)s.%(ext)s")}"'
    # 清晰度
    # definition = f'18'  # 360p
    # definition = f'18' # 720p
    # definition = f'24' # 1080p
    # f'-f 18 -vU'
    download_options = f'-f mp4'
    # 要执行的 shell 命令
    command = f'yt-dlp -v {download_options} {network_options} --verbose -- {url}'
    # print(command)
    # 使用 subprocess 调用 shell 命令
    result = subprocess.run(command, shell=True, capture_output=True, text=True)

    # 检查命令执行结果
    if result.returncode == 0:
        # 命令成功执行,输出结果
        # log.debug(str(result.stdout))
        return True
    else:
        # 命令执行失败,输出错误信息
        # log.debug(str(result.stderr))
        return False