import pandas as pd
# 将项目根目录添加到 sys.path
#project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#sys.path.append(project_root)

# 导入当站目录的config文件
try:
    # 尝试相对导入（作为包的一部分）
    from .config import TS_TOKEN, START_DATE, END_DATE 
    from .stock_utils import dataCorrect,get_trading_dates,tscodeCheck
except (ImportError, SystemError):  
    # 失败则使用绝对导入（直接运行脚本）
    from config import TS_TOKEN, START_DATE, END_DATE 
    from stock_utils import dataCorrect,get_trading_dates,tscodeCheck

from .data_source import get_tushare_pro
pro = get_tushare_pro()

def getStockMargin(tscode: str, start_date: str=START_DATE, end_date: str=END_DATE) -> pd.DataFrame:
    """
    获取指定股票代码在时间区间内的每日融资明细数据

    参数:
        tscode (str): 股票代码，格式如 '600000.SH'
        start_date (str): 开始日期，格式 'YYYY-MM-DD'
        end_date (str): 结束日期，格式 'YYYY-MM-DD'

    返回:
        pd.DataFrame: 包含融资明细数据的DataFrame，列包括:
            - trade_date: 交易日期
            - tscode: 股票代码
            - rzye: 融资余额(元)
            - rqye 	float 	融券余额(元)
            - rzmre 	float 	融资买入额(元)
            - rqyl 	float 	融券余量（股）
            - rzche 	float 	融资偿还额(元)
            - rqchl 	float 	融券偿还量(股)
            - rqmcl 	float 	融券卖出量(股,份,手)
            - rzrqye 	float 	融资融券余额(元)

    异常处理:
        - 若tushare接口调用失败，打印错误信息并返回空DataFrame
    """
    try:
        tscode=tscodeCheck(tscode)
        # 调用tushare接口
        df = pro.margin_detail(ts_code=tscode, start_date=start_date, end_date=end_date)
        cols=["rzye","rqye","rzmre","rqyl","rzche","rqchl","rqmcl","rzrqye"]
        df = dataCorrect(df,cols)
        if df.empty:
            print(f"未找到{tscode}在{start_date}至{end_date}期间的融资数据")
        return df
    except Exception as e:
        print(f"获取融资数据失败: {e}")
        return pd.DataFrame()
    
def getDailyMargin(trade_date: str = None, start_date: str = None, end_date: str = None, exchange_id: str = None) -> pd.DataFrame:
    """
    获取指定日期或时间区间内的每日融资明细数据

    参数:
        trade_date (str, optional): 指定单个交易日，格式 'YYYY-MM-DD'。与start_date/end_date互斥
        start_date (str, optional): 开始日期，格式 'YYYY-MM-DD'。需与end_date同时使用
        end_date (str, optional): 结束日期，格式 'YYYY-MM-DD'。需与start_date同时使用
        exchange_id (str, optional): 交易所代码，如 'SSE'（上交所）、'SZSE'（深交所）

    返回:
        pd.DataFrame: 包含每日融资明细数据的DataFrame，列包括:
            - exchange_id: 交易所代码
            - trade_date: 交易日期
            - rzye: 融资余额(元)
            - rqye: 融券余额(元)
            - rzmre: 融资买入额(元)
            - rqyl: 融券余量（股）
            - rzche: 融资偿还额(元)
            - rqchl: 融券偿还量(股)
            - rqmcl: 融券卖出量(股,份,手)
            - rzrqye: 融资融券余额(元)

    异常处理:
        - 若参数组合无效，打印错误信息并返回空DataFrame
        - 若tushare接口调用失败，打印错误信息并返回空DataFrame
    """
    try:
        # 日期格式转换
        if trade_date:
            trade_date = trade_date.replace("-", "")
        if start_date:
            start_date = start_date.replace("-", "")
        if end_date:
            end_date = end_date.replace("-", "")
        # 参数校验
        if trade_date and (start_date or end_date):
            print("错误：trade_date不能与start_date/end_date同时使用")
            return pd.DataFrame()

        if (start_date and not end_date) or (end_date and not start_date):
            print("错误：start_date和end_date必须同时使用")
            return pd.DataFrame()

        # 调用tushare接口
        df = pro.margin(exchange_id=exchange_id,
                       trade_date=trade_date,
                       start_date=start_date,
                       end_date=end_date)

        if df.empty:
            print("未找到符合条件的融资数据")
        return df
    except Exception as e:
        print(f"获取每日融资数据失败: {e}")
        return pd.DataFrame()

if __name__ == "__main__":
    # 测试getStockMargin函数
    test_code = "600000.SH"
    test_start = "20150101"
    test_end = "20250731"

    result = getStockMargin(test_code, test_start, test_end)
    print("返回结果示例:")
    print(result.head())

    if not result.empty:
        print(f"\n返回数据行数: {len(result)}")