"""
市场数据分析器
用于分析历史交易数据并计算合理的默认值
"""

import logging
import statistics
from datetime import datetime, timedelta
from typing import Dict, List, Optional, Union
from tortoise.models import Model
from tortoise import Tortoise

logger = logging.getLogger(__name__)


class MarketDataAnalyzer:
    """市场数据分析器"""
    
    def __init__(self):
        """初始化市场数据分析器"""
        pass
    
    async def get_recent_transaction_median(self, days: int = 30) -> float:
        """
        获取近期交易数据的中间值
        
        Args:
            days: 天数，默认30天
            
        Returns:
            float: 交易数据的中间值（万元）
        """
        try:
            # 计算日期范围
            end_date = datetime.now()
            start_date = end_date - timedelta(days=days)
            
            # 从数据库查询近期的估值记录
            from app.models.valuation import Valuation
            
            # 查询近期有价格波动数据的记录
            recent_valuations = await Valuation.filter(
                created_at__gte=start_date,
                price_fluctuation__isnull=False
            ).all()
            
            # 提取所有价格数据
            all_prices = []
            for valuation in recent_valuations:
                if valuation.price_fluctuation:
                    try:
                        # price_fluctuation 是一个包含价格区间的列表
                        prices = [float(price) for price in valuation.price_fluctuation if price is not None]
                        all_prices.extend(prices)
                    except (ValueError, TypeError) as e:
                        logger.warning(f"价格数据转换失败: {e}")
                        continue
            
            # 如果有足够的数据，计算中间值
            if len(all_prices) >= 5:  # 至少需要5个数据点
                median_price = statistics.median(all_prices)
                logger.info(f"计算得到近{days}天交易数据中间值: {median_price}万元 (基于{len(all_prices)}个数据点)")
                return median_price
            else:
                # 数据不足时，使用保守的默认值
                default_value = 10000.0  # 1万元，比原来的5万元更保守
                logger.warning(f"近{days}天交易数据不足({len(all_prices)}个数据点)，使用保守默认值: {default_value}万元")
                return default_value
                
        except Exception as e:
            logger.error(f"获取近期交易数据中间值失败: {e}")
            # 出错时使用保守的默认值
            return 10000.0
    
    async def get_market_price_statistics(self, days: int = 30) -> Dict[str, float]:
        """
        获取市场价格统计信息
        
        Args:
            days: 天数，默认30天
            
        Returns:
            Dict: 包含最小值、最大值、中间值、平均值的统计信息
        """
        try:
            # 计算日期范围
            end_date = datetime.now()
            start_date = end_date - timedelta(days=days)
            
            # 从数据库查询近期的估值记录
            from app.models.valuation import Valuation
            
            recent_valuations = await Valuation.filter(
                created_at__gte=start_date,
                price_fluctuation__isnull=False
            ).all()
            
            # 提取所有价格数据
            all_prices = []
            for valuation in recent_valuations:
                if valuation.price_fluctuation:
                    try:
                        prices = [float(price) for price in valuation.price_fluctuation if price is not None]
                        all_prices.extend(prices)
                    except (ValueError, TypeError):
                        continue
            
            if len(all_prices) >= 3:
                return {
                    'min': min(all_prices),
                    'max': max(all_prices),
                    'median': statistics.median(all_prices),
                    'mean': statistics.mean(all_prices),
                    'count': len(all_prices)
                }
            else:
                # 数据不足时返回默认统计
                return {
                    'min': 5000.0,
                    'max': 15000.0,
                    'median': 10000.0,
                    'mean': 10000.0,
                    'count': 0
                }
                
        except Exception as e:
            logger.error(f"获取市场价格统计信息失败: {e}")
            return {
                'min': 5000.0,
                'max': 15000.0,
                'median': 10000.0,
                'mean': 10000.0,
                'count': 0
            }
    
    def calculate_adaptive_default_value(self, asset_type: str = None, scarcity_level: str = None) -> float:
        """
        根据资产类型和稀缺等级计算自适应默认值
        
        Args:
            asset_type: 资产类型
            scarcity_level: 稀缺等级
            
        Returns:
            float: 自适应默认值（万元）
        """
        # 基础默认值
        base_value = 10000.0
        
        # 根据稀缺等级调整
        scarcity_multipliers = {
            '孤品': 2.0,      # 孤品：全球唯一，不可复制
            '限量': 1.5,      # 限量发行
            '稀有': 1.2,      # 稀有
            '流通': 1.0       # 普通流通
        }
        
        if scarcity_level:
            # 提取稀缺等级关键词
            for level, multiplier in scarcity_multipliers.items():
                if level in scarcity_level:
                    base_value *= multiplier
                    break
        
        logger.info(f"自适应默认值计算: 资产类型={asset_type}, 稀缺等级={scarcity_level}, 默认值={base_value}万元")
        return base_value


# 全局实例
market_data_analyzer = MarketDataAnalyzer()


# 示例使用
if __name__ == "__main__":
    import asyncio
    
    async def test_analyzer():
        analyzer = MarketDataAnalyzer()
        
        # 测试获取近期交易数据中间值
        median_value = await analyzer.get_recent_transaction_median(30)
        print(f"近30天交易数据中间值: {median_value}万元")
        
        # 测试获取市场价格统计
        stats = await analyzer.get_market_price_statistics(30)
        print(f"市场价格统计: {stats}")
        
        # 测试自适应默认值
        adaptive_value = analyzer.calculate_adaptive_default_value("传统工艺", "限量发行")
        print(f"自适应默认值: {adaptive_value}万元")
    
    # 运行测试
    asyncio.run(test_analyzer())