package service

import (
	"context"
	"time"

	"go-common/app/admin/main/upload/conf"
	"go-common/app/admin/main/upload/dao"
	"go-common/app/admin/main/upload/model"
	"go-common/library/database/orm"
	"go-common/library/log"

	"github.com/jinzhu/gorm"
)

// Service struct
type Service struct {
	c           *conf.Config
	orm         *gorm.DB
	bucketCache map[string]*model.Bucket
	dao         *dao.Dao
}

// New init
func New(c *conf.Config) (s *Service) {
	s = &Service{
		c:   c,
		orm: orm.NewMySQL(c.ORM),
		dao: dao.New(c),
	}
	s.bucketCache = make(map[string]*model.Bucket)
	go s.cacheproc()
	return s
}

// Ping Service
func (s *Service) Ping(c context.Context) (err error) {
	return nil
}

// Close Service
func (s *Service) Close() {
	s.orm.Close()
}

func (s *Service) cacheproc() {
	for {
		s.loadcache()
		time.Sleep(5 * time.Minute)
	}
}

func (s *Service) loadcache() {
	var buckets []*model.Bucket
	if err := s.orm.Table("bucket").Order("id desc").Limit(1000).Find(&buckets).Error; err != nil {
		log.Error("read bucket error(%v)", err)
		return
	}
	b := make(map[string]*model.Bucket)
	for _, v := range buckets {
		b[v.BucketName] = v
	}
	s.bucketCache = b
}