package config

import (
	"context"
	"sync"

	"github.com/pomerium/pomerium/internal/log"
)

// The LogManager configures logging based on options.
type LogManager struct {
	mu sync.Mutex
}

// NewLogManager creates a new LogManager.
func NewLogManager(ctx context.Context, src Source) *LogManager {
	mgr := &LogManager{}
	src.OnConfigChange(ctx, mgr.OnConfigChange)
	mgr.OnConfigChange(ctx, src.GetConfig())
	return mgr
}

// Close closes the log manager.
func (mgr *LogManager) Close() error {
	return nil
}

// OnConfigChange is called whenever configuration changes.
func (mgr *LogManager) OnConfigChange(ctx context.Context, cfg *Config) {
	if cfg == nil || cfg.Options == nil {
		return
	}

	mgr.mu.Lock()
	defer mgr.mu.Unlock()

	if cfg.Options.Debug {
		log.EnableDebug()
	} else {
		log.DisableDebug()
	}

	if cfg.Options.LogLevel != "" {
		log.SetLevel(cfg.Options.LogLevel)
	}
}