#!/usr/bin/env python3

import os
import sys

from typing import List, Dict, Any, Optional, Tuple, Union
import logging

import json
import yaml


def read_json_file(file_path):
    """
    读取mcp_client_config的JSON文件并返回解析后的数据
    
    参数:
        file_path: JSON文件的路径
        
    返回:
        解析后的JSON数据（通常是字典或列表），如果出错则返回None
    """
    try:
        # 使用with语句打开文件，确保文件会被正确关闭
        with open(file_path, 'r', encoding='utf-8') as file:
            # 加载并解析JSON数据
            json_data = json.load(file)
            print(f"成功读取JSON文件: {file_path}")
            return json_data
            
    except FileNotFoundError:
        print(f"错误: 找不到文件 '{file_path}'")
    except json.JSONDecodeError:
        print(f"错误: 文件 '{file_path}' 不是有效的JSON格式")
    except PermissionError:
        print(f"错误: 没有权限读取文件 '{file_path}'")
    except Exception as e:
        print(f"读取JSON文件时发生错误: {str(e)}")
    
    return None

# def persist_context_ndjson(self,
#                         persist_directory:str,
#                         rw_mode:str="w",
#                         encoding:str="utf-8",
#                         start:Optional[int] = None,
#                         end:Optional[int] = None):

#         if start is not None:
#             S_idx = start if start > 0 else 0
#         else:
#             S_idx = 0
        
#         chat_history_len = len(self.chat_history)
#         if end is not None:
#             E_idx = end if end < chat_history_len  else chat_history_len - 1
#         else:
#             E_idx = chat_history_len - 1

#         #保存到NDJSON文件
#         with open(file=persist_directory, mode=rw_mode, encoding=encoding) as f:
#             for i in range(S_idx,E_idx) :
#                 item = self.chat_history[i]

#                 if isinstance(item, HumanMessage):
#                     context_line={"用户": item.content}
#                     # context += f"用户: {item.content}\n"
#                 elif isinstance(item, AIMessage):
#                     context_line={"助手": item.content}
#                     # context += f"助手: {item.content}\n"
#                 elif isinstance(item, dict) and item["type"] == "image":
#                     # context += f"用户发送了一张图像: {item['description']}\n"
#                     context_line={"用户": f"用户发送了一张图像: {item['description']}"}
#                 # context_ndjson.append(context_line)
#                 json_str = json.dumps(context_line, ensure_ascii=False)

#                 f.write(json_str + "\n")

from pathlib import Path

def persist_listdata2ndjson(data_list:Optional[dict[str,Any]], 
                            file_path:str,
                            rw_mode:str="w",
                            encoding="utf-8"
                            ):
    """
    将列表数据保存为NDJSON文件（每行一个JSON对象）
    
    :param data_list: 要保存的列表（元素需为可JSON序列化的对象，如dict）
    :param file_path: 输出的NDJSON文件路径
    """
    # 确保文件目录存在（若路径包含未创建的目录，自动创建）
    Path(file_path).parent.mkdir(parents=True, exist_ok=True)
    
    with open(file=file_path, mode=rw_mode, encoding=encoding) as f:
        for index, item in enumerate(data_list):
            try:
                # 将列表元素转为JSON字符串（保留中文，不转义）
                json_str = json.dumps(item, ensure_ascii=False)
                # 写入字符串并换行（确保每行一个JSON对象）
                f.write(json_str + "\n")
            except json.JSONDecodeError as e:
                # 捕获序列化失败的元素，提示索引便于排查
                print(f"警告：列表第 {index} 个元素无法序列化为JSON，已跳过 - 错误：{e}")

def persist_list2json(data_list:Optional[dict[str,Any]], 
                      file_path:str,
                      rw_mode:str="w",
                      encoding="utf-8"
                            ):
    """
    将包含字典的列表保存为JSON文件
    
    :param data_list: 待保存的列表（元素为字典）
    :param file_path: 输出的JSON文件路径
    """
    # 确保文件目录存在（若路径包含未创建的目录，自动创建）
    Path(file_path).parent.mkdir(parents=True, exist_ok=True)
    with open(file=file_path, mode=rw_mode, encoding=encoding) as f:
        json.dump(obj=data_list, fp=f, ensure_ascii=False, indent=4)


def read_yaml_file(yaml_path:str,
                     rw_mode:str="r",
                     encoding:str="utf-8"):
    """
    加载并解析YAML文件，返回参数字典
    
    Args:
        yaml_path (str): YAML文件路径
        
    Returns:
        dict: 解析后的参数字典（若解析失败返回空字典）
    """
    # 检查文件是否存在
    if not Path(yaml_path).exists():
        print(f"错误：YAML文件不存在 - {yaml_path}")
        return {}
    
    try:
        # 打开并解析YAML文件（使用safe_load避免安全风险）
        with open(file=yaml_path, mode=rw_mode, encoding=encoding) as f:
            params = yaml.safe_load(stream=f)  # safe_load支持标准YAML类型，拒绝执行代码
        
        # 检查解析结果是否为字典（YAML根节点通常是字典）
        if not isinstance(params, dict):
            print("错误：YAML文件根节点必须是字典")
            return {}
        
        return params
    
    except yaml.YAMLError as e:
        # 处理YAML格式错误（如缩进错误、语法错误）
        print(f"YAML解析错误：{e}")
        return {}
    except Exception as e:
        # 处理其他异常（如权限问题）
        print(f"加载YAML文件失败：{e}")
        return {}
