"""
utils/__init__.py

该模块初始化文件，导入了多个辅助工具类，并定义了一系列便捷函数，用于日志记录、配置管理、文件操作、字符串处理和邮件发送等功能。
"""
import json

from utils.ai_helper import AiHelper
from utils.config_helper import ConfigHelper
from utils.email_helper import EmailHelper
from utils.file_helper import FileHelper
from utils.logger_helper import LoggerHelper
from utils.string_helper import StringHelper


def get_logger():
    """
    获取日志记录器实例。

    该函数通过调用LoggerHelper类的静态方法get_logger()来获取一个日志记录器实例。
    主要用于需要记录日志的位置，通过该函数获取日志记录器实例，然后进行日志记录。
    这样做可以保持日志记录的一致性和集中管理。

    :return: Logger实例，用于记录日志。
    """
    return LoggerHelper.get_logger()


def clean_log_file(day: int):
    """
    清理指定天数之前的日志文件。

    :param day: 整数，表示清理多少天前的日志文件。
    """
    LoggerHelper.clean_log_file(day)


def get_config():
    """
    获取配置管理器实例。

    该函数返回一个ConfigHelper实例，用于读取和管理应用程序的配置信息。

    :return: ConfigHelper实例，用于配置管理。
    """
    return ConfigHelper()


def reload_config():
    """
    重新加载配置文件。

    该函数会重新加载配置文件中的内容，适用于配置文件发生更改后需要重新加载的情况。
    """
    get_config().load_config()


def get_config_value(key: str, default: str = None):
    """
    获取配置项的值。

    :param key: 字符串，配置项的键。
    :param default: 字符串，默认值（可选）。
    :return: 配置项的值，如果不存在则返回默认值。
    """
    return get_config().get(key, default)


def get_config_int(key: str, default: int = None):
    """
    获取配置项的整数值。

    :param key: 字符串，配置项的键。
    :param default: 整数，默认值（可选）。
    :return: 配置项的整数值，如果不存在则返回默认值。
    """
    return get_config().get_int(key, default)


def get_config_bool(key: str):
    """
    获取配置项的布尔值。

    :param key: 字符串，配置项的键。
    :return: 配置项的布尔值。
    """
    return get_config().get_bool(key)


def download_remote_file(file_url: str, file_name: str) -> str:
    """
    下载远程文件并保存到本地。

    :param file_url: 字符串，远程文件的URL。
    :param file_name: 字符串，保存到本地的文件名。
    :return: 字符串，下载后的文件路径。
    """
    return FileHelper().download_remote_file(file_url, file_name)


def clean_attach_file(day: int):
    """
    清理指定天数之前的附件文件。

    :param day: 整数，表示清理多少天前的附件文件。
    """
    FileHelper().clean_attach_file(day)


def save_report_excel(data, file_name: str = None) -> str:
    """
    保存报表数据到Excel文件。

    :param data: 列表，报表数据。
    :param file_name: 字符串，保存的文件名（可选）。
    :return: 字符串，保存的文件路径。
    """
    return FileHelper().save_report_excel(data, file_name)


def clean_report_file(day: int):
    """
    清理指定天数之前的报表文件。

    :param day: 整数，表示清理多少天前的报表文件。
    """
    FileHelper().clean_report_file(day)

def encode_file(path: str):
    return FileHelper.encode_file(path)

def to_array(s: str, split: str = ",") -> list[str]:
    """
    将字符串按指定分隔符拆分为数组。

    :param s: 字符串，待拆分的字符串。
    :param split: 字符串，分隔符。
    :return: 列表，拆分后的数组。
    """
    return StringHelper.to_array(s, split)

def to_str(data:dict|list|tuple):
    """
    将对象转成字符串
    :param data:
    :return:
    """
    return StringHelper.to_str(data)
def is_email(email: str) -> bool:
    """
    判断字符串是否为有效的电子邮件地址。

    :param email: 字符串，待判断的电子邮件地址。
    :return: 布尔值，是否为有效的电子邮件地址。
    """
    return StringHelper.is_email(email)

def is_phone(phone: str) -> bool:
    """
    判断字符串是否为有效的手机号码。

    :param phone: 字符串，待判断的手机号码。
    :return: 布尔值，是否为有效的手机号码。
    """
    return StringHelper.is_phone(phone)

def call_openai(system_prompt: str, user_prompt: str) -> json:
    """
    调用OpenAI API进行对话。

    :param system_prompt: 字符串，系统提示信息。
    :param user_prompt: 字符串，用户输入的提示信息。
    :return: JSON对象，API返回的结果。
    """
    return AiHelper().call_openai(system_prompt, user_prompt)


def send_email(
    to_addr: str,
    subject: str,
    body: str,
    body_is_html: bool = True,
    attachment_paths: str = None,
) -> bool:
    """
    发送电子邮件。

    :param to_addr: 字符串，收件人地址。
    :param subject: 字符串，邮件主题。
    :param body: 字符串，邮件正文。
    :param body_is_html: 布尔值，是否为HTML格式，默认为True。
    :param attachment_paths: 字符串，附件路径（可选）。
    :return: 布尔值，表示邮件是否发送成功。
    """
    return EmailHelper().send_email(
        to_addr, subject, body, body_is_html, attachment_paths
    )
