package logger

import (
	"context"
	"log"
	"time"

	"lune/talentscale/internal/domain"
)

var logChan chan *domain.SystemLog
var repo domain.SystemLogRepository
var isAsync bool

func Init(r domain.SystemLogRepository, async bool) {
	repo = r
	isAsync = async
	logChan = make(chan *domain.SystemLog, 1000)

	if isAsync {
		go processLogs()
	}
}

func processLogs() {
	for logEntry := range logChan {
		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
		if err := repo.Create(ctx, logEntry); err != nil {
			log.Printf("⚠️ Failed to save log to DB: %v", err)
		}
		cancel()
	}
}

func Log(logEntry *domain.SystemLog) {
	if logEntry.CreatedAt.IsZero() {
		logEntry.CreatedAt = time.Now()
	}

	if isAsync && logChan != nil {
		select {
		case logChan <- logEntry:
		default:
			log.Printf("⚠️ Log channel full, dropping log: %s", logEntry.Message)
		}
	} else if repo != nil {
		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
		defer cancel()
		if err := repo.Create(ctx, logEntry); err != nil {
			log.Printf("⚠️ Failed to save log to DB (sync): %v", err)
		}
	}
}
