import os

from app.algorithms.cleaning import flow as _flow_module
from app.algorithms.cleaning import pressure as _pressure_module


############################################################
# 流量监测数据清洗   ***卡尔曼滤波法***
############################################################
# 2025/08/21 hxyan


def flow_data_clean(input_csv_file: str) -> str:
    """
    读取 input_csv_path 中的每列时间序列，使用一维 Kalman 滤波平滑并用预测值替换基于 3σ 检测出的异常点。
    保存输出为：<input_filename>_cleaned.xlsx（与输入同目录），并返回输出文件的绝对路径。如有同名文件存在，则覆盖。
    :param: input_csv_file: 输入的 CSV 文件明或路径
    :return: 输出文件的绝对路径
    """

    # 提供的 input_csv_path 绝对路径，以下为 默认脚本目录下同名 CSV 文件，构建绝对路径，可根据情况修改
    # 使用 algorithms 根目录保持与原 data_cleaning.py 一致的行为
    script_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    input_csv_path = os.path.join(script_dir, input_csv_file)

    # 检查文件是否存在
    if not os.path.exists(input_csv_path):
        raise FileNotFoundError(f"指定的文件不存在: {input_csv_path}")
    # 调用 clean_flow_data_kf 函数进行数据清洗
    out_xlsx_path = _flow_module.clean_flow_data_kf(input_csv_path)
    print("清洗后的数据已保存到:", out_xlsx_path)


############################################################
# 压力监测数据清洗   ***kmean++法***
############################################################
# 2025/08/21 hxyan


def pressure_data_clean(input_csv_file: str) -> str:
    """
    读取 input_csv_path 中的每列时间序列，使用Kmean++清洗数据。
    保存输出为：<input_filename>_cleaned.xlsx（与输入同目录），并返回输出文件的绝对路径。如有同名文件存在，则覆盖。
    原始数据在 sheet 'raw_pressure_data'，处理后数据在 sheet 'cleaned_pressusre_data'。
    :param input_csv_path: 输入的 CSV 文件路径
    :return: 输出文件的绝对路径
    """

    # 提供的 input_csv_path 绝对路径，以下为 默认脚本目录下同名 CSV 文件，构建绝对路径，可根据情况修改
    # 使用 algorithms 根目录保持与原 data_cleaning.py 一致的行为
    script_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    input_csv_path = os.path.join(script_dir, input_csv_file)

    # 检查文件是否存在
    if not os.path.exists(input_csv_path):
        raise FileNotFoundError(f"指定的文件不存在: {input_csv_path}")
    # 调用 clean_pressure_data_km 函数进行数据清洗
    out_xlsx_path = _pressure_module.clean_pressure_data_km(input_csv_path)
    print("清洗后的数据已保存到:", out_xlsx_path)
