import tushare as ts
import pandas as pd
from datetime import datetime, timedelta
from typing import Tuple

def get_historical_data(stock_code: str, end_date: str, days: int) -> pd.DataFrame:
    """
    获取历史价格数据
    :param stock_code: 股票代码
    :param end_date: 基准日期(YYYYMMDD)
    :param days: 需要获取的天数
    :return: DataFrame包含日期、最高价、最低价、收盘价
    """
    # 初始化tushare
    ts.set_token('a1b1c30c7dbf5507042e939c47fcef0dcea5e215138c2a5ce2f7230d')  # 需要替换为实际token
    pro = ts.pro_api()
    
    # 处理日期参数
    try:
        end_date_dt = datetime.strptime(end_date, '%Y%m%d')
        start_date_dt = end_date_dt - timedelta(days=days*2)
        start_date_str = start_date_dt.strftime('%Y%m%d')
        end_date_str = end_date_dt.strftime('%Y%m%d')
    except ValueError:
        raise ValueError("日期格式应为YYYYMMDD")
    
    # 获取前复权数据
    # 验证股票代码有效性
    stock_info = pro.stock_basic(ts_code=stock_code)
    if stock_info.empty:
        raise ValueError(f"无效的股票代码: {stock_code}")

    # 直接获取前复权数据
    df = pro.daily(
        ts_code=stock_code,
        start_date=start_date_str,
        end_date=end_date_str,
        adj='qfq'
    )
    
    # 检查数据是否足够
    if len(df) < days:
        raise ValueError(f"数据不足，只有{len(df)}个交易日数据")
    
    # 处理数据
    df = df.sort_values('trade_date')
    df = df.tail(days)  # 取最后days天的数据
    df = df.rename(columns={
        'trade_date': 'date',
        'high': 'high',
        'low': 'low',
        'close': 'close'
    })
    
    return df[['date', 'high', 'low', 'close']]