import os
import shutil
from fastapi import UploadFile
from PIL import Image


def file_path(*path):
    """
    拼接返回文件路径
    :param path:
    :return:
    """
    return_path = os.path.join(*path)
    return return_path


def create_folder(*path):
    """根据路径创建文件夹"""
    folder_path = os.path.join(*path)
    try:
        os.makedirs(folder_path, exist_ok=True)
    except Exception as e:
        print(f"创建文件夹时错误： {e}")
    return folder_path


def save_images(*path, file: UploadFile):
    """
    保存上传的图片
    :param path: 路径
    :param file: 文件
    :return:
    """
    save_path = os.path.join(*path, file.filename)

    os.makedirs(os.path.dirname(save_path), exist_ok=True)
    with open(save_path, "wb") as f:
        for line in file.file:
            f.write(line)
    return save_path


def create_thumbnail(input_image_path, out_image_path, size=(116, 70)):
    """
    给图片生成缩略图
    :param input_image_path:
    :param out_image_path:
    :param size: 缩略的尺寸
    :return:
    """
    with Image.open(input_image_path) as image:
        # 使用thumbnail方法生成缩略图，参数size指定缩略图的最大尺寸
        # 注意：thumbnail方法会保持图片的宽高比不变
        image.thumbnail(size)
        os.makedirs(os.path.dirname(out_image_path), exist_ok=True)
        # 保存生成的缩略图
        image.save(out_image_path, 'JPEG')


def copy_and_rename_file(src_file_path, dst_dir, new_name):
    """
    复制文件到指定目录并重命名，保持文件的后缀不变。
    :param src_file_path: 源文件路径
    :param dst_dir: 目标目录
    :param new_name: 新文件名（不含扩展名）
    """
    # 获取文件的完整文件名（包括扩展名）
    base_name = os.path.basename(src_file_path)
    # 分离文件名和扩展名
    file_name, file_extension = os.path.splitext(base_name)

    # 构建新的文件名和目标路径
    new_file_name = f"{new_name}{file_extension}"
    dst_file_path = os.path.join(dst_dir, new_file_name)

    # 确保目标目录存在
    os.makedirs(dst_dir, exist_ok=True)

    # 复制文件到目标位置并重命名
    shutil.copy(src_file_path, dst_file_path)


def delete_file_if_exists(*file_paths: str):
    """
    删除文件
    :param file_path:
    :return:
    """
    for path in file_paths:
        if os.path.exists(path):  # 检查文件是否存在
            os.remove(path)       # 删除文件


def delete_paths(paths):
    """
    删除给定路径数组中的每个路径及其包含的所有内容。
    :param paths: 文件或目录路径的列表
    """
    for path in paths:
        if os.path.exists(path):
            try:
                if os.path.isfile(path) or os.path.islink(path):
                    # 如果是文件或符号链接，则删除
                    os.remove(path)
                    print(f"Deleted file: {path}")
                elif os.path.isdir(path):
                    # 如果是目录，则递归删除
                    shutil.rmtree(path)
            except Exception as e:
                print(f"路径删除失败 {path}: {e}")
        else:
            print(f"路径不存在: {path}")
