package com.bizzan.bitrade.job;

import com.bizzan.bitrade.service.StakingService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 质押解冻定时任务
 * 每天凌晨1点执行，负责将到期订单转为释放中并执行余额释放
 *
 * @author auto
 * @date 2026-05-17
 */
@Component
@Slf4j
public class StakingReleaseJob {

    @Autowired
    private StakingService stakingService;

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    /**
     * 每天凌晨1点执行质押解冻与释放：
     * 1. 将所有锁定期已到期的"质押中"订单状态更新为"解冻释放中"
     * 2. 对所有"解冻释放中"的订单，按配置规则执行本次周期的余额释放，并记录流水
     */
    @Scheduled(cron = "0 0 1 * * *")
    public void processStakingRelease() {
        log.info("[质押释放任务] 开始执行...");
        try {
            // 1. 将到期订单改为解冻释放中
            stakingService.processUnlockOrders();

            // 2. 对解冻释放中的订单执行本批次释放，返回本次实际释放的用户ID列表
            List<Long> releasedMemberIds = stakingService.processReleaseOrders();

            // 3. 所有事务已提交，在事务外统一发送 MQ 通知，确保消费方读到最新数据
            for (Long memberId : releasedMemberIds) {
                kafkaTemplate.send("trading-account-change", memberId + "");
            }
            log.info("[质押释放任务] 本次共通知 {} 个用户账户变更", releasedMemberIds.size());
        } catch (Exception e) {
            log.error("[质押释放任务] 执行异常：{}", e.getMessage(), e);
        }
        log.info("[质押释放任务] 执行完成");
    }
}
