package log

import (
	"github.com/robfig/cron/v3"
	"path"
	"sync"
	"time"
)

type manager struct {
	startAt time.Time
	fire    chan string
	cr      *cron.Cron
	context chan int
	wg      sync.WaitGroup
	lock    sync.Mutex
}

func (m *manager) Fire() chan string {
	return m.fire
}

func (m *manager) Close() {
	close(m.context)
	m.cr.Stop()
}

func NewManager(c *Config) (Manager, error) {
	m := &manager{
		startAt: time.Now(),
		cr:      cron.New(),
		fire:    make(chan string),
		context: make(chan int),
		wg:      sync.WaitGroup{},
	}

	if _, err := m.cr.AddFunc(c.RollingTimePattern, func() {
		m.fire <- m.GenLogFileName(c)
	}); err != nil {
		return nil, err
	}
	m.cr.Start()

	return m, nil
}

func (m *manager) GenLogFileName(c *Config) (filename string) {
	m.lock.Lock()
	filename = path.Join(c.LogPath, c.FileName+"-"+m.startAt.Format(c.TimeTagFormat)) + c.LogSuffix
	m.startAt = time.Now()
	m.lock.Unlock()
	return
}