// white-box testing
package host

import (
	"context"
	"fmt"
	"log"
	"net"
	"net/http"
	"os"
	"time"
)

type myTestTask struct {
	delay  time.Duration
	logger *log.Logger
}

func (m myTestTask) Run(proc TaskProcess) {
	ticker := time.NewTicker(m.delay)
	defer ticker.Stop()
	rans := 0
	for {
		select {
		case _, ok := <-ticker.C:
			{
				if !ok {
					m.logger.Println("ticker issue, closed channel, exiting from this task...")
					return
				}
				rans++
				m.logger.Println(fmt.Sprintf("%d", rans))
			}
		case <-proc.Done():
			{
				m.logger.Println("canceled, exiting from task AND SHUTDOWN the server...")
				proc.Host().Shutdown(context.TODO())
				return
			}
		}
	}
}

func SchedulerSchedule() {
	h := New(&http.Server{
		Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		}),
	})
	logger := log.New(os.Stdout, "Supervisor: ", 0)

	delaySeconds := 2

	mytask := myTestTask{
		delay:  time.Duration(delaySeconds) * time.Second,
		logger: logger,
	}

	cancel := h.Schedule(mytask)
	ln, err := net.Listen("tcp4", ":9090")
	if err != nil {
		panic(err.Error())
	}

	logger.Println("server started...")
	logger.Println("we will cancel the task after 2 runs (the third will be canceled)")
	cancelAfterRuns := 2
	time.AfterFunc(time.Duration(delaySeconds*cancelAfterRuns+(delaySeconds/2))*time.Second, func() {
		cancel()
		logger.Println("cancel sent")
	})
	h.Serve(ln)

	// Output:
	// Supervisor: server started...
	// Supervisor: we will cancel the task after 2 runs (the third will be canceled)
	// Supervisor: 1
	// Supervisor: 2
	// Supervisor: cancel sent
	// Supervisor: canceled, exiting from task AND SHUTDOWN the server...
}