package com.agri.framework.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * 前端在线心跳处理器
 * 核心功能：
 * 1. 处理前端在线心跳消息
 * 2. 续期前端订阅关系TTL，兜底异常退出场景
 * 适配JDK 8，无心跳包相关逻辑
 */
@Component
public class FrontendOnlineHandler {
    /**
     * 优化：统一使用SLF4J日志（JDK 8兼容）
     */
    private static final Logger log = LoggerFactory.getLogger(FrontendOnlineHandler.class);

    /**
     * Redis模板，用于存储订阅关系、设备在线状态、分布式锁
     */
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    // 新增：前端订阅关系TTL（兜底“取消订阅失败/异常退出”）——只维护subc:{clientId}的TTL
    @Value("${spring.mqtt.subc-ttl-seconds:3600}")
    private int subcTtlSeconds;

    /**
     * 新增：处理前端在线心跳：写入Redis在线标记（带TTL）
     * 主题格式：frontend/{clientId}/online
     */
    public void handle(String topic, String payload) {
        try {
            String[] parts = topic.split("/");
            if (parts.length < 3) {
                return;
            }
            String clientId = parts[1];
            if (!StringUtils.hasText(clientId)) {
                return;
            }

            // 续期subc:{clientId}
            stringRedisTemplate.expire("subc:" + clientId, subcTtlSeconds, TimeUnit.SECONDS);

            // todo 生产环境不建议打印每次心跳
//            log.debug("【在线心跳】clientId={} 续期subcTTL={}s payload={}", clientId, subcTtlSeconds, payload);
        } catch (Exception e) {
            log.warn("【在线心跳】处理失败 topic={} msg={}", topic, e.getMessage());
        }
    }
}