"""
风险调整系数B3计算模块

风险调整系数B3 = 0.8 + 风险评分总和R × 0.4

"""

from typing import Dict, List


class RiskAdjustmentB3Calculator:
    """风险调整系数B3计算器"""

    def __init__(self):
        pass

    def calculate_risk_adjustment_b3(self, risk_score_sum: float) -> float:
        """
        计算风险调整系数B3
        
        
        风险调整系数B3 = 0.8 + 风险评分总和R × 0.4
        
        args:
            risk_score_sum: 风险评分总和R (系统计算)
            
        return:
            float: 风险调整系数B3
        """

        risk_adjustment = 0.8 + risk_score_sum * 0.4

        return risk_adjustment

    def calculate_risk_score_sum(self, market_risk: float, legal_risk: float, inheritance_risk: float) -> float:
        """
        计算风险评分总和R
        
        
        风险评分总和R = 市场风险 × 0.3 + 法律风险 × 0.4 + 传承风险 × 0.3
        
        args:
            market_risk: 市场风险 (用户填写)
            legal_risk: 法律风险 (用户填写)
            inheritance_risk: 传承风险 (用户填写)
            
        return:
            float: 风险评分总和R
        """

        risk_score_sum = (market_risk * 0.3 + legal_risk * 0.4 + inheritance_risk * 0.3)/10

        return risk_score_sum

    def calculate_market_risk(self, highest_price: float, lowest_price: float) -> float:
        """
        计算市场风险
        
        用户填写近30天资产商品的最高价与最低价，系统自动计算波动率，波动率=近30日价格极差/均值，≤5%(10分)、5-15%(5分)、>15%(0分)
        市场风险 = 资产商品的价格波动率
        波动率 = 过去30天价格区间 / 过去30天平均价格
        
        评分标准：
        - 波动率 ≤5%: 10分
        - 波动率 5-15%: 5分  
        - 波动率 >15%: 0分
        
        args:
            highest_price: 过去30天最高价格 (用户填写)
            lowest_price: 过去30天最低价格 (用户填写)
            
        return:
            float: 市场风险评分 (0-10)
        """
        if highest_price <= 0 or lowest_price <= 0:
            return 0.0

        # 计算平均价格
        average_price = (highest_price + lowest_price) / 2

        # 计算价格区间
        price_range = highest_price - lowest_price

        # 计算波动率
        volatility = price_range / average_price

        # 根据波动率评分
        if volatility <= 0.05:  # ≤5%
            return 10.0
        elif volatility <= 0.15:  # 5-15%
            return 5.0
        else:  # >15%
            return 0.0

    def calculate_legal_risk(self, lawsuit_status: float) -> float:
        """
        计算法律风险
        

        法律风险 = 侵权诉讼历史
        
        评分标准：
        - 无诉讼: 10分
        - 已解决诉讼: 7分
        - 未解决诉讼: 0分

        args:
            lawsuit_status: 诉讼状态 (API获取)
            
        return:
            float: 法律风险评分 (0-10)
        """
        # lawsuit_scores = {
        #     "无诉讼": 10.0,
        #     "已解决诉讼": 7.0,
        #     "未解决诉讼": 0.0
        # }

        # return lawsuit_scores.get(lawsuit_status, 0.0)
        return lawsuit_status
    def calculate_inheritance_risk(self, inheritor_ages: List[int]) -> float:
        """
        计算传承风险
        用户填写该资产的所有受认证传承人年龄，若有多位受认证传承人则填写多位，传承人年龄≤50岁(10分)、50-70岁(5分)、>70岁(0分)
        
        传承风险 = 传承人年龄
        
        评分标准：
        - 传承人年龄 ≤50岁: 10分
        - 传承人年龄 50-70岁: 5分
        - 传承人年龄 >70岁: 0分
        
        如果有多个传承人，取最高分
        
        args:
            inheritor_ages: 传承人年龄列表 (用户填写)
            
        return:
            float: 传承风险评分 (0-10)
        """
        if not inheritor_ages:
            return 0.0

        max_score = 0.0

        for age in inheritor_ages:
            if age <= 50:
                score = 10.0
            elif age <= 70:
                score = 5.0
            else:
                score = 0.0

            max_score = max(max_score, score)

        return max_score

    def calculate_complete_risky_value_b3(self, input_data: Dict) -> Dict:
        # 计算各项风险评分
        market_risk = self.calculate_market_risk(input_data["highest_price"], input_data["lowest_price"])
        legal_risk = self.calculate_legal_risk(input_data["lawsuit_status"])
        inheritance_risk = self.calculate_inheritance_risk(input_data["inheritor_ages"])

        # 计算风险评分总和R
        risk_score_sum = self.calculate_risk_score_sum(market_risk, legal_risk, inheritance_risk)

        # 计算风险调整系数B3
        risk_adjustment_b3 = self.calculate_risk_adjustment_b3(risk_score_sum)
        return {
            'risk_score_sum': risk_score_sum,
            'risk_adjustment_b3': risk_adjustment_b3
        }


# 示例使用
if __name__ == "__main__":
    # 创建计算器实例
    calculator = RiskAdjustmentB3Calculator()

    # 示例数据
    # 市场风险：过去30天价格数据
    highest_price = 340  # 过去30天最高价格 (用户填写)
    lowest_price = 300  # 过去30天最低价格 (用户填写)

    # 法律风险：诉讼状态
    lawsuit_status = 10  # 诉讼状态 (API获取)

    # 传承风险：传承人年龄
    inheritor_ages = [100,20,5]  # 传承人年龄列表 (用户填写)

    # 计算各项风险评分
    market_risk = calculator.calculate_market_risk(highest_price, lowest_price)
    legal_risk = calculator.calculate_legal_risk(lawsuit_status)
    inheritance_risk = calculator.calculate_inheritance_risk(inheritor_ages)

    # 计算风险评分总和R
    risk_score_sum = calculator.calculate_risk_score_sum(market_risk, legal_risk, inheritance_risk)

    # 计算风险调整系数B3
    risk_adjustment_b3 = calculator.calculate_risk_adjustment_b3(risk_score_sum)

    print(f"市场风险评分: {market_risk:.1f}")
    print(f"法律风险评分: {legal_risk:.1f}")
    print(f"传承风险评分: {inheritance_risk:.1f}")
    print(f"风险评分总和R: {risk_score_sum:.4f}")
    print(f"风险调整系数B3: {risk_adjustment_b3:.4f}")
