package main

import (
	"os"
	"path"
	"runtime"
	"sync"

	_ "image/gif"
	_ "image/jpeg"
	_ "image/png"

	"github.com/aerogo/log"
	"github.com/animenotifier/arn"
	"github.com/animenotifier/avatar/lib"
	"github.com/fatih/color"
)

var wg sync.WaitGroup

// Main
func main() {
	color.Yellow("Generating user avatars")
	defer arn.Node.Close()

	// Switch to main directory
	exe, err := os.Executable()

	if err != nil {
		panic(err)
	}

	root := path.Dir(exe)
	os.Chdir(path.Join(root, "../../"))

	// Log
	lib.Log.AddOutput(log.File("logs/avatar.log"))
	defer lib.Log.Flush()

	if InvokeShellArgs() {
		return
	}

	// Worker queue
	usersQueue := make(chan *arn.User, runtime.NumCPU())
	StartWorkers(usersQueue, lib.RefreshAvatar)

	// We'll send each user to one of the worker threads
	for user := range arn.StreamUsers() {
		wg.Add(1)
		usersQueue <- user
	}

	wg.Wait()

	color.Green("Finished.")
}

// StartWorkers creates multiple workers to handle a user each.
func StartWorkers(queue chan *arn.User, work func(*arn.User)) {
	for w := 0; w < runtime.NumCPU(); w++ {
		go func() {
			for user := range queue {
				work(user)
				wg.Done()
			}
		}()
	}
}