package task

import (
	"context"
	"time"

	"github.com/zeromicro/go-zero/core/logx"
	plantModel "sundynix-micro-go/app/plant/model"
	"sundynix-micro-go/app/plant/rpc/internal/svc"
)

// ExpireCareTaskJob 每日检查过期养护任务（status=1 且 due_date < 今天 → 标记为 status=3）
type ExpireCareTaskJob struct {
	svcCtx *svc.ServiceContext
}

func NewExpireCareTaskJob(svcCtx *svc.ServiceContext) *ExpireCareTaskJob {
	return &ExpireCareTaskJob{svcCtx: svcCtx}
}

func (j *ExpireCareTaskJob) Run() {
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
	defer cancel()

	today := time.Now().Truncate(24 * time.Hour)
	logx.WithContext(ctx).Infof("[CRON] 开始执行养护任务过期检查, 基准时间: %v", today)

	res := j.svcCtx.DB.WithContext(ctx).
		Model(&plantModel.CareTask{}).
		Where("status = 1 AND due_date < ?", today).
		Update("status", 3)

	if res.Error != nil {
		logx.WithContext(ctx).Errorf("[CRON] 养护任务过期检查失败: %v", res.Error)
		return
	}
	logx.WithContext(ctx).Infof("[CRON] 养护任务过期检查完成，共标记 %d 条任务为过期", res.RowsAffected)
}
