import { Injectable, Logger } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';
import { C2cService } from '../services/c2c.service';
import { RedisService } from '../../infrastructure/redis/redis.service';

/**
 * C2C订单超时处理定时任务
 *
 * 处理场景：
 * 1. MATCHED状态但付款超时（默认15分钟）-> 自动取消，解冻双方资产
 * 2. PAID状态但确认收款超时（默认60分钟）-> 自动完成或进入申诉（目前自动标记过期）
 */
@Injectable()
export class C2cExpiryScheduler {
  private readonly logger = new Logger(C2cExpiryScheduler.name);

  constructor(
    private readonly c2cService: C2cService,
    private readonly redis: RedisService,
  ) {}

  /**
   * 每分钟检查并处理超时订单
   */
  @Cron(CronExpression.EVERY_MINUTE)
  async processExpiredOrders(): Promise<void> {
    // 使用分布式锁防止多实例并发执行
    const lockKey = 'c2c:expiry:scheduler:lock';
    const lockValue = await this.redis.acquireLock(lockKey, 60);
    if (!lockValue) {
      return; // 其他实例正在处理
    }

    try {
      const processedCount = await this.c2cService.processExpiredOrders();
      if (processedCount > 0) {
        this.logger.log(`C2C超时处理完成: 处理了 ${processedCount} 个订单`);
      }
    } catch (error) {
      this.logger.error('C2C超时处理失败', error);
    } finally {
      await this.redis.releaseLock(lockKey, lockValue);
    }
  }
}
