package ats_tracer

import (
	"slices"
	"sync"
	"time"

	"gitea.timerzz.com/kedaya_haitao/common/structs/storage"
	v2 "gitea.timerzz.com/kedaya_haitao/common/structs/v2"
	"github.com/sirupsen/logrus"
)

type Tracer struct {
	pArticle      *v2.ProviderArticle
	tracing       bool      //是不是正在抓
	lastTraceTime time.Time //上次是什么时候抓的
	lastAts       int       // 上次抓取的库存
}

type Tracers struct {
	m    sync.RWMutex
	list []*Tracer

	providerId v2.ProviderId
	storage    *storage.Storage
	ready      bool
}

func NewTracers(storage *storage.Storage, providerId v2.ProviderId) *Tracers {
	return &Tracers{
		storage:    storage,
		providerId: providerId,
		list:       make([]*Tracer, 0),
	}
}

func (w *Tracers) Add(article *v2.ProviderArticle) {
	w.m.Lock()
	defer w.m.Unlock()
	if !slices.ContainsFunc(w.list, func(item *Tracer) bool {
		return item.pArticle.SkuID == article.SkuID
	}) {
		w.list = append(w.list, &Tracer{pArticle: article, lastAts: -1})
	}
}

func (w *Tracers) Remove(skuID string) {
	for i, item := range w.list {
		if item.pArticle.SkuID == skuID {
			w.m.Lock()
			w.list = append(w.list[:i], w.list[i+1:]...)
			w.m.Unlock()
			return
		}
	}
}

func (w *Tracers) Range(filter func(tracer *Tracer) bool, do func(tracer *Tracer)) {
	w.m.RLock()
	defer w.m.RUnlock()
	for _, item := range w.list {
		if filter(item) {
			do(item)
		}
	}
}

func (w *Tracers) Exist(skuID string) bool {
	w.m.RLock()
	defer w.m.RUnlock()
	for _, item := range w.list {
		if item.pArticle.SkuID == skuID {
			return true
		}
	}
	return false
}

func (w *Tracers) Load() (err error) {
	var articles []*v2.ProviderArticle
	articles, err = w.storage.ProviderArticle().Find(
		storage.NewGetProviderArticleQuery().
			SetProviderId(w.providerId).
			SetTraceAts(true),
	)
	if err != nil {
		return err
	}
	w.m.Lock()
	defer w.m.Unlock()
	for _, article := range articles {
		w.list = append(w.list, &Tracer{pArticle: article})
	}
	logrus.Infof("共加载%d个需要追踪库存的商品\n", len(w.list))
	w.ready = true
	return
}

// 返回ready
func (w *Tracers) Ready() bool {
	return w.ready
}