package main

import (
	"fmt"
	"math/rand"
	"time"

	"mongo.games.com/goserver/core/basic"
	"mongo.games.com/goserver/core/module"
	"mongo.games.com/goserver/core/task"
)

var TaskExampleSington = &TaskExample{}

type TaskExample struct {
	id int
}

// in task.Worker goroutine
func (this *TaskExample) Call(o *basic.Object) interface{} {
	tNow := time.Now()
	fmt.Println("[", this.id, "]TaskExample execute start ")
	time.Sleep(time.Second * time.Duration(rand.Intn(10)))
	fmt.Println("[", this.id, "]TaskExample execute end, take ", time.Now().Sub(tNow))
	return nil
}

// in laucher goroutine
func (this *TaskExample) Done(i interface{}, t *task.Task) {
	fmt.Println("TaskExample execute over")
}

// //////////////////////////////////////////////////////////////////
// / Module Implement [beg]
// //////////////////////////////////////////////////////////////////
func (this *TaskExample) ModuleName() string {
	return "taskexample"
}

func (this *TaskExample) Init() {
	for i := 1; i < 100; i++ {
		th := &TaskExample{id: i}
		t := task.New(nil, th, th, "test")
		if b := t.StartByExecutor(fmt.Sprintf("%v", i)); !b {
			fmt.Println("[", i, "]task lauch failed")
		} else {
			fmt.Println("[", i, "]task lauch success")
		}
	}

	for i := 100; i < 200; i++ {
		th := &TaskExample{id: i}
		t := task.New(nil, th, th, "test")
		w := rand.Intn(100)
		go func(id, n int) {
			if b := t.StartByFixExecutor(fmt.Sprintf("test%v", n)); !b {
				fmt.Println("[", id, "]task lauch failed")
			} else {
				fmt.Println("[", id, "]task lauch success")
			}
		}(i, w)
	}
}

func (this *TaskExample) Update() {
	fmt.Println("TaskExample.Update")
}

func (this *TaskExample) Shutdown() {
	module.UnregisteModule(this)
}

////////////////////////////////////////////////////////////////////
/// Module Implement [end]
////////////////////////////////////////////////////////////////////

func init() {
	module.RegisteModule(TaskExampleSington, time.Second, 0)
}
