from datetime import datetime, timedelta

class TemporalDecayC4Calculator:
    """时效性衰减C4计算器"""
    
    def __init__(self):
        """初始化计算器"""
        pass
    
    def calculate_temporal_decay_c4(self, time_elapsed: str) -> float:
        """
        计算时效性衰减C4
        
        近一周：1.0
        近一月：0.7
        近一年：0.4
        其他：0.1
        基于最近一次市场活动（交易、报价、鉴定）距今天数
        
        args:
            time_elapsed: 距离最近市场活动的时间 (用户选择)
            
        retuen:
            float: 时效性衰减C4
        """
        timeliness_coefficients = {
            "近一周": 1.0,
            "近一月": 0.7,
            "近一年": 0.4,
            "其他": 0.1
        }
        
        return timeliness_coefficients.get(time_elapsed, 0.1)
    @staticmethod
    def classify_date_distance(target_date):
        """
        计算日期距离今天是近一周、近一月、近一年还是其他

        target_date: 目标日期，可以是字符串或datetime对象
                   字符串格式支持：'YYYY-MM-DD', 'YYYY/MM/DD', 'YYYYMMDD'

        """
        # 获取当前日期
        today = datetime.now().date()

        # 处理输入日期
        if isinstance(target_date, str):
            # 如果是数字字符串"0"或空字符串，使用默认日期
            if target_date == "0" or target_date.strip() == "":
                # 默认为一年前，返回"其他"
                return "其他"
            
            # 尝试不同的日期格式
            formats = ['%Y-%m-%d', '%Y/%m/%d', '%Y%m%d']
            date_obj = None
            for fmt in formats:
                try:
                    date_obj = datetime.strptime(target_date, fmt).date()
                    break
                except ValueError:
                    continue
            if date_obj is None:
                # 如果无法解析日期，记录警告并返回默认值
                print(f"警告: 无法解析日期 '{target_date}'，使用默认值'其他'")
                return "其他"
        elif isinstance(target_date, datetime):
            date_obj = target_date.date()
        elif isinstance(target_date, (int, float)):
            # 如果传入的是数字（如0），使用默认值
            print(f"警告: 传入的日期参数是数字 {target_date}，使用默认值'其他'")
            return "其他"
        else:
            date_obj = target_date

        # 计算日期差
        delta = today - date_obj

        # 分类判断
        if delta.days <= 7:
            return "近一周"
        elif delta.days <= 30:
            return "近一月"
        elif delta.days <= 365:
            return "近一年"
        else:
            return "其他"
# 示例使用
if __name__ == "__main__":
    # 创建计算器实例
    calculator = TemporalDecayC4Calculator()
    
    # 示例数据
    time_elapsed = "2024-01-15"  # 距离最近市场活动的时间 (用户选择)
    
    # 计算时效性衰减C4
    temporal_decay_c4 = calculator.calculate_temporal_decay_c4(time_elapsed)
    
    print(f"距离最近市场活动时间: {time_elapsed}")
    print(f"时效性衰减C4: {temporal_decay_c4:.4f}")

