package main

import (
	"fmt"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"

	"github.com/pingcap/lark2es/pkg/config"
	"github.com/pingcap/lark2es/pkg/job"
)

func init() {
	config.InitConfig("config", "yaml", "../etc")
	job.Start()
}

func TestOnStartup(t *testing.T) {
	checker := NewVacationChecker()
	checker.OnStartup()
}

func TestGetDailyVacationApprovals(t *testing.T) {
	token, err := GetItalentToken()
	if err != nil {
		t.Fatal(err)
	}

	assert.NotEmpty(t, token.AccessToken)
	today := time.Now().Add(-3 * time.Hour).Format("2006-01-02")
	t.Log(today)
	vacations, err := GetDailyVacationApprovals(token.AccessToken, today) //time.Now().Format("2006-01-02"))
	if err != nil {
		t.Fatal(err)
	}

	assert.Equal(t, 200, vacations.Code)

	ct := 0
	for _, vacation := range vacations.Data.VacationList {
		if vacation.VacationType == "remote" ||
			vacation.ApproveStatus != "通过" {
			continue
		}
		ct++

		fmt.Println(vacation.StaffEmail, vacation.VacationStartDateTime, vacation.VacationStopDateTime, vacation.Reason)
	}
	t.Log(ct)
}

func TestVacationChecker_CancleVacation(t *testing.T) {
	checker := NewVacationChecker()
	employee := EmployeeVacation{Email: "jie.li@pingcap.com"}
	err := checker.QueryLarkOpenIdByEmail(&employee)
	if err != nil {
		t.Fatal(err)
	}
	assert.NotEmpty(t, employee.FeishuOpenId)

	employee.StartDate = "2022-10-31 01:00"
	employee.EndDate = "2022-11-11 23:59"
	employee.VacationTitle = "请假"
	//employee.TimeoffEventId = "timeoff:d543fcf3-f60a-1a17-5726-f70cbf77ec3e-1650506951"
	err = checker.CreateVacation(&employee)
	if err != nil {
		t.Fatal(err)
	}
	assert.NotEmpty(t, employee.TimeoffEventId)
	time.Sleep(2 * time.Second)
	//
	//checker.CancleVacation(&employee)
	//assert.Empty(t, employee.TimeoffEventId)
}

func TestEmployeeVacation_DealShortly(t *testing.T) {
	checker := NewVacationChecker()
	ev := EmployeeVacation{Email: "chenjianlin@pingcap.com", StartDate: "2021-10-12 16:00",
		EndDate: "2021-10-12 17:00", IsShortly: true}
	ev.checker = checker
	ev.DealShortly()

	time.Sleep(time.Minute)
}

func TestVacationChecker_CreateRun(t *testing.T) {
	checker := NewVacationChecker()
	checker.getvacationsfn = func(token, day string) (*ItalentVacation, error) {
		vacations := ItalentVacation{}
		vacations.Data.VacationList = []ItalentVacationDetail{
			{VacationType: "病假", VacationID: "11",
				StaffEmail: "chenjianlin@pingcap.com", ApproveStatus: "通过",
				DocumentType: "请假", VacationStartDateTime: "2021-10-11 13:00",
				VacationStopDateTime: "2021-10-11 00:00", VacationDurationIncludeUnit: "1天",
			},
			{VacationType: "事假", VacationID: "2",
				StaffEmail: "yumin.li@pingcap.com", ApproveStatus: "通过",
				DocumentType: "请假", VacationStartDateTime: "2021-10-11 00:00",
				VacationStopDateTime: "2021-10-11 00:00", VacationDurationIncludeUnit: "1天",
			},
			{VacationType: "短期休假", VacationID: "3",
				StaffEmail: "chenjianlin@pingcap.com", ApproveStatus: "通过",
				DocumentType: "请假", VacationStartDateTime: "2021-10-11 13:00",
				VacationStopDateTime: "2021-10-11 17:00", VacationDurationIncludeUnit: "4小时",
			},
		}
		return &vacations, nil
	}

	AutoMigrate(checker.DB)
	checker.Run()
}

func TestVacationChecker_CancleRun(t *testing.T) {
	checker := NewVacationChecker()
	checker.getvacationsfn = func(token, day string) (*ItalentVacation, error) {
		vacations := ItalentVacation{}
		vacations.Data.VacationList = []ItalentVacationDetail{
			{VacationType: "年假", VacationID: "1",
				StaffEmail: "chenjianlin@pingcap.com", ApproveStatus: "通过",
				DocumentType: "销假", VacationStartDateTime: "2021-10-11 00:00",
				VacationStopDateTime: "2021-10-11 00:00", VacationDurationIncludeUnit: "1天",
			},
			{VacationType: "事假", VacationID: "3",
				StaffEmail: "yumin.li@pingcap.com", ApproveStatus: "通过",
				DocumentType: "销假", VacationStartDateTime: "2021-10-11 00:00",
				VacationStopDateTime: "2021-10-11 00:00", VacationDurationIncludeUnit: "1天",
			},
		}
		return &vacations, nil
	}

	AutoMigrate(checker.DB)
	checker.Run()
}
