package lib

import (
	"fmt"
	"time"

	"rul.sh/go-ytmp3/utils"
)

type Task struct {
	Url       string `json:"url"`
	Slug      string `json:"slug"`
	Thumbnail string `json:"thumbnail"`
	Title     string `json:"title"`
	Artist    string `json:"artist"`
	Album     string `json:"album"`
	IsPending bool   `json:"is_pending"`
	Result    string `json:"result"`
	Error     error  `json:"error"`
}

var tasks = []*Task{}
var queue = []*Task{}

func NewTask(task Task) *Task {
	task.IsPending = true

	queue = append(queue, &task)
	tasks = append(tasks, &task)
	if len(tasks) > 20 {
		tasks = tasks[1:]
	}

	return &task
}

func GetTasks() []*Task {
	return tasks
}

type TaskScheduler struct {
	Ch chan bool
}

func InitTaskScheduler() *TaskScheduler {
	ch := make(chan bool)
	outDir := utils.GetEnv("OUT_DIR", "/tmp")

	go func() {
		for {
			select {
			case <-ch:
				return
			default:
				if len(queue) == 0 {
					time.Sleep(1 * time.Second)
					continue
				}

				task := queue[0]
				queue = queue[1:]

				video, err := YtGetVideo(task.Url)
				if err != nil {
					task.Error = err
					task.IsPending = false
					continue
				}

				result, err := Yt2Mp3(&video, Yt2Mp3Options{
					OutDir:    outDir,
					Slug:      task.Slug,
					Thumbnail: task.Thumbnail,
					Title:     task.Title,
					Artist:    task.Artist,
					Album:     task.Album,
				})

				if err != nil {
					fmt.Println(err)
				}

				task.IsPending = false
				task.Error = err
				task.Result = result
			}
		}
	}()

	return &TaskScheduler{Ch: ch}
}

func (s *TaskScheduler) Stop() {
	s.Ch <- true
}