"""
analyse.py - 对弹幕进行读取、筛选、统计和保存的模块
"""
from collections import Counter
import pandas as pd

def read_danmakus(filename):
    """
    从 Excel 文件中读取弹幕内容，并返回弹幕列表。

    :param filename: Excel 文件名
    :return: 弹幕内容列表
    """
    try:
        data_frame = pd.read_excel(filename)  # 读取 Excel 文件
        return data_frame['弹幕内容'].tolist()  # 返回弹幕内容列的列表
    except FileNotFoundError:
        print(f"文件 {filename} 未找到。")
        return []
    except pd.errors.EmptyDataError:
        print(f"文件 {filename} 是空的。")
        return []

def filter_danmakus(danmakus, keywords):
    """
    根据关键词筛选弹幕内容。

    :param danmakus: 弹幕内容列表
    :param keywords: 关键词列表
    :return: 筛选后的弹幕内容列表
    """
    # 根据关键词筛选弹幕
    filtered_danmakus = []  # 存储筛选后的弹幕
    for danmaku in danmakus:
        # 如果弹幕中包含任意一个关键词，则添加到筛选列表
        if any(keyword in danmaku for keyword in keywords):
            filtered_danmakus.append(danmaku)
    return filtered_danmakus  # 返回筛选后的弹幕列表

def count_danmakus(danmakus):
    """
    统计弹幕出现的频率。

    :param danmakus: 弹幕内容列表
    :return: 弹幕频率计数器
    """
    # 使用 Counter 统计弹幕出现频率
    return Counter(danmakus)  # 返回弹幕频率的计数器

def get_top_danmakus(counter, top_n=8):
    """
    获取出现频率最高的 N 条弹幕。

    :param counter: 弹幕频率计数器
    :param top_n: 需要返回的弹幕数量
    :return: 出现频率最高的弹幕列表
    """
    # 获取出现频率最高的 N 个弹幕
    return counter.most_common(top_n)  # 返回出现频率最高的弹幕及其数量

def save_top_danmakus_to_excel(top_danmakus, output_filename):
    """
    将统计结果保存到 Excel 文件中。

    :param top_danmakus: 频率最高的弹幕列表
    :param output_filename: 输出文件名
    """
    try:
        # 将统计结果保存到 Excel 文件中
        data_frame = pd.DataFrame(top_danmakus, columns=["弹幕内容", "数量"])  # 创建 DataFrame
        data_frame.to_excel(output_filename, index=False)  # 保存到 Excel 文件
        print(f"统计结果已保存到 {output_filename}")  # 输出保存结果的提示信息
    except FileNotFoundError:
        print(f"输出文件路径 {output_filename} 未找到，请检查路径是否正确。")
    except ValueError as value_error:
        print(f"数据转换错误: {value_error}. 请检查数据格式。")
    except PermissionError:
        print(f"没有权限写入文件 {output_filename}。请检查文件权限。")

def main():
    """
    主函数，执行弹幕读取、筛选、统计和保存结果的逻辑。
    """
    # 读取弹幕文件
    input_filename = "all_danmakus.xlsx"  # 输入文件名
    danmakus = read_danmakus(input_filename)  # 读取弹幕内容
    if not danmakus:
        print("没有读取到任何弹幕内容。")
        return

    # 定义关键词列表
    keywords = ["AI技术", "智能", "科技", "应用", "数据", "科学技术", "光影数字", "视觉"]

    # 筛选与关键词相关的弹幕
    filtered_danmakus = filter_danmakus(danmakus, keywords)  # 筛选相关弹幕
    print(f"筛选出 {len(filtered_danmakus)} 条与关键词相关的弹幕。")  # 输出筛选结果数量

    # 统计弹幕
    danmaku_counter = count_danmakus(filtered_danmakus)  # 统计弹幕频率

    # 获取排名前 8 的弹幕
    top_danmakus = get_top_danmakus(danmaku_counter)  # 获取频率最高的弹幕

    # 输出统计结果
    for content, count in top_danmakus:
        print(f"弹幕: {content}, 数量: {count}")  # 输出每条弹幕及其出现次数

    # 保存到 Excel
    output_filename = "top_danmakus.xlsx"  # 输出文件名
    save_top_danmakus_to_excel(top_danmakus, output_filename)  # 保存结果到 Excel

if __name__ == "__main__":
    main()  # 执行主函数
