package com.test.musichouduan.util;

import com.test.musichouduan.entity.Music;
import java.time.Duration;
import java.time.LocalDateTime;

/**
 * 热度分数计算工具类
 */
public class HotScoreUtil {

    // 定义各种交互的权重
    private static final double LIKE_WEIGHT = 1.0;
    private static final double COLLECT_WEIGHT = 2.0;
    private static final double COMMENT_WEIGHT = 1.5;

    // 时间衰减因子中的指数，可以调整以改变时间衰减的速度
    private static final double TIME_DECAY_EXPONENT = 1.8;

    /**
     * 计算单首音乐的热度分数
     * 采用类似 Hacker News 的热度算法: 热度 = (交互权重和) / (时间衰减因子)
     *
     * @param music 音乐实体对象
     * @return 计算出的热度分数
     */
    public static double calculateHotScore(Music music) {
        // 1. 计算交互权重和
        // 如果交互数据为 null，则默认为 0
        long likeCount = music.getLikeCount() != null ? music.getLikeCount() : 0;
        long collectCount = music.getCollectCount() != null ? music.getCollectCount() : 0;
        long commentCount = music.getCommentCount() != null ? music.getCommentCount() : 0;

        double interactionScore = (likeCount * LIKE_WEIGHT) +
                                  (collectCount * COLLECT_WEIGHT) +
                                  (commentCount * COMMENT_WEIGHT);

        // 2. 计算时间衰减因子
        // (当前时间 - 创建时间)的小时数
        LocalDateTime createTime = music.getCreateTime();
        LocalDateTime now = LocalDateTime.now();
        long hoursElapsed = Duration.between(createTime, now).toHours();

        // 为了避免新发布内容因分母过小（接近0）而导致分数无限大的问题，
        // 我们给分母加上一个常数（这里是2），确保其初始值不会太小。
        double timeDecayFactor = Math.pow(hoursElapsed + 2, TIME_DECAY_EXPONENT);

        // 3. 计算最终热度分数
        return interactionScore / timeDecayFactor;
    }
}
