package service

import (
	"fmt"
	"os"
	"testing"
	"time"

	"github.com/pingcap-inc/clinic/pkg/auth/session"
	"github.com/pingcap-inc/clinic/pkg/datasource"
	"github.com/pingcap-inc/clinic/pkg/db"
	"github.com/pingcap-inc/clinic/pkg/db/model"
	"github.com/pingcap-inc/clinic/pkg/db_docker"
	"github.com/pingcap-inc/clinic/pkg/db_docker/db/impl"
	"github.com/pingcap-inc/clinic/pkg/task_manager/task"
	_import "github.com/pingcap-inc/clinic/pkg/task_manager/task/import"
)

var (
	MockK8sClient   task.K8sClient
	MockGlobalLimit *task.GlobalLimit
)

var service = &TaskManagerService{}

func TestMain(m *testing.M) {
	fmt.Println("start tests")
	impl.ReleaseAll()
	_ = db_docker.TryInitDB()

	initData()
	initService()
	code := m.Run()
	impl.ReleaseAll()
	os.Exit(code)
}

func initData() {
	_, err := model.CreateOrganization("pingcap-inc", "create for test", 1, func(orgID uint) error {
		return nil
	})
	if err != nil {
		panic(err)
	}
	_, err = datasource.GetOrganization(&session.CtxUser{
		Internal: false,
	}, 1)
	if err != nil {
		panic(err)
	}

	if _, err = model.InsertUserIfAbsent("internal_test", "test_user01", "test01", true); err != nil {
		panic(err)
	}
	for i := 0; i < 10; i++ {
		cid := fmt.Sprintf("Test_01_%d", i)
		name := fmt.Sprintf("test01_%d", i)
		startTime, err := time.Parse("2006-01-02 15:04:05", "2017-04-11 13:0"+fmt.Sprint(i)+":37")
		if err != nil {
			panic(err)
		}
		endTime, err := time.Parse("2006-01-02 15:04:05", "2017-04-12 13:0"+fmt.Sprint(i)+":37")
		if err != nil {
			panic(err)
		}
		_, err = model.AddClusterIfPresent(&db.Cluster{
			ClusterID:   cid,
			Name:        name,
			OrgID:       uint(1),
			StartTime:   uint64(startTime.Unix()),
			EndTime:     uint64(endTime.Unix()),
			Version:     "v5.1.0",
			ClusterType: "1",
		})
		if err != nil {
			panic(err)
		}
	}

	for i := 0; i < 10; i++ {
		startTime, _ := time.Parse("2006-01-02 15:04:05", "2017-04-11 13:0"+fmt.Sprint(i)+":37")
		endTime, _ := time.Parse("2006-01-02 15:04:05", "2017-04-12 13:0"+fmt.Sprint(i)+":37")
		file := db.UploadFile{
			ClusterID: "Test_01_1",
			OrgID:     1,
			BeginTime: &startTime,
			EndTime:   &endTime,
			FileUUID:  fmt.Sprintf("FileUUID_%d", i),
		}
		err = model.InsertUploadFile(&file)
	}
	/*fileconfig := config.FileStorage{}
	awss, _ := aws.NewAWSStorage(fileconfig)
	manager := manager2.NewUploadFileManager(awss)*/

	if err != nil {
		panic(err)
	}
}

func initService() {
	service.scanner = _import.NewScannerService(MockK8sClient, MockGlobalLimit)
}
