package polling

import (
	"context"
	"time"

	"go.uber.org/zap"

	packagepkg "github.com/break/junhong_cmp_fiber/internal/service/package"
)

// DataResetHandler 流量重置调度处理器
// 任务 20: 定期检查需要重置的套餐并调用 ResetService 执行重置
type DataResetHandler struct {
	resetService *packagepkg.ResetService
	logger       *zap.Logger

	lastDailyReset   time.Time
	lastMonthlyReset time.Time
	lastYearlyReset  time.Time
}

// NewDataResetHandler 创建流量重置调度处理器
func NewDataResetHandler(
	resetService *packagepkg.ResetService,
	logger *zap.Logger,
) *DataResetHandler {
	now := time.Now()
	return &DataResetHandler{
		resetService:     resetService,
		logger:           logger,
		lastDailyReset:   now,
		lastMonthlyReset: now,
		lastYearlyReset:  now,
	}
}

// HandleDataReset 任务 20.2: 处理流量重置调度
// 每 10 秒被 Scheduler 调用一次，检查是否需要执行日/月/年重置
func (h *DataResetHandler) HandleDataReset(ctx context.Context) error {
	now := time.Now()

	// 任务 20.3: 日重置调度（每分钟检查一次，避免频繁查询数据库）
	if now.Sub(h.lastDailyReset) >= time.Minute {
		if err := h.processDailyReset(ctx); err != nil {
			h.logger.Warn("日重置调度失败", zap.Error(err))
		}
		h.lastDailyReset = now
	}

	// 任务 20.4: 月重置调度（每分钟检查一次）
	if now.Sub(h.lastMonthlyReset) >= time.Minute {
		if err := h.processMonthlyReset(ctx); err != nil {
			h.logger.Warn("月重置调度失败", zap.Error(err))
		}
		h.lastMonthlyReset = now
	}

	// 任务 20.5: 年重置调度（每分钟检查一次）
	if now.Sub(h.lastYearlyReset) >= time.Minute {
		if err := h.processYearlyReset(ctx); err != nil {
			h.logger.Warn("年重置调度失败", zap.Error(err))
		}
		h.lastYearlyReset = now
	}

	return nil
}

// processDailyReset 任务 20.3: 日重置调度
func (h *DataResetHandler) processDailyReset(ctx context.Context) error {
	if h.resetService == nil {
		return nil
	}

	startTime := time.Now()
	if err := h.resetService.ResetDailyUsage(ctx); err != nil {
		return err
	}

	h.logger.Info("日重置调度完成",
		zap.Duration("duration", time.Since(startTime)))

	return nil
}

// processMonthlyReset 任务 20.4: 月重置调度
func (h *DataResetHandler) processMonthlyReset(ctx context.Context) error {
	if h.resetService == nil {
		return nil
	}

	startTime := time.Now()
	if err := h.resetService.ResetMonthlyUsage(ctx); err != nil {
		return err
	}

	h.logger.Info("月重置调度完成",
		zap.Duration("duration", time.Since(startTime)))

	return nil
}

// processYearlyReset 任务 20.5: 年重置调度
func (h *DataResetHandler) processYearlyReset(ctx context.Context) error {
	if h.resetService == nil {
		return nil
	}

	startTime := time.Now()
	if err := h.resetService.ResetYearlyUsage(ctx); err != nil {
		return err
	}

	h.logger.Info("年重置调度完成",
		zap.Duration("duration", time.Since(startTime)))

	return nil
}
