package imp

import (
	"strings"
	"time"

	l4g "github.com/alecthomas/log4go"
	"github.com/avast/retry-go"
	"github.com/dailymotion/allure-go"
	"github.com/pingcap/errors"
	"github.com/tidbcloud/qa-PlatformAPIAuto/models"
)

func (b *BaseImportScene) waitImporting() {
	err := retry.Do(
		func() error {
			imp, err := b.Get()
			if err != nil {
				return err
			}
			if *imp.Status != models.DataflowImportGetRespStatusIMPORTING {
				return errors.Errorf("import(%s) status is not importing, current status is %s", imp.ID, string(*imp.Status))
			}
			return nil
		},
		retry.DelayType(retry.FixedDelay),
		retry.Delay(time.Second*2),
		retry.Attempts(5),
		retry.OnRetry(func(n uint, err error) {
			l4g.Info("#%d: %s\n", n, err)
		}),
	)

	if err != nil {
		l4g.Error(err)
		allure.FailNow(err)
	}
}

func (b *BaseImportScene) waitCompleted() {
	time.Sleep(time.Minute)
	err := retry.Do(
		func() error {
			imp, err := b.Get()
			if err != nil {
				return err
			}
			if *imp.Status != models.DataflowImportGetRespStatusCOMPLETED {
				return errors.Errorf("import(%s) status is not completed, current status is %s, progress is %d", imp.ID, string(*imp.Status), *imp.CompletedPercent)
			}
			return nil
		},
		retry.RetryIf(func(err error) bool {
			return strings.Contains(err.Error(), "current status is IMPORTING")
		}),
		retry.DelayType(retry.FixedDelay),
		// sometimes the gcp import pod ready too slowly to start import, maybe it is a bug
		retry.Delay(time.Second*30),
		retry.Attempts(60),
		retry.OnRetry(func(n uint, err error) {
			l4g.Info("#%d: %s\n", n, err)
		}),
	)

	if err != nil {
		l4g.Error(err)
		allure.FailNow(err)
	}
}

func (b *BaseImportScene) waitCanceling() {
	err := retry.Do(
		func() error {
			imp, err := b.Get()
			if err != nil {
				return err
			}
			if *imp.Status != models.DataflowImportGetRespStatusCANCELING {
				return errors.Errorf("import(%s) status is not canceling, current status is %s", imp.ID, string(*imp.Status))
			}
			return nil
		},
		retry.DelayType(retry.FixedDelay),
		retry.Delay(time.Second*2),
		retry.Attempts(5),
		retry.OnRetry(func(n uint, err error) {
			l4g.Info("#%d: %s\n", n, err)
		}),
	)

	if err != nil {
		l4g.Error(err)
		allure.FailNow(err)
	}
}

func (b *BaseImportScene) waitCanceled() {
	err := retry.Do(
		func() error {
			imp, err := b.Get()
			if err != nil {
				return err
			}
			if *imp.Status != models.DataflowImportGetRespStatusCANCELED {
				return errors.Errorf("import(%s) status is not canceled, current status is %s", imp.ID, string(*imp.Status))
			}
			return nil
		},
		retry.DelayType(retry.FixedDelay),
		retry.Delay(time.Second*10),
		retry.Attempts(20),
		retry.OnRetry(func(n uint, err error) {
			l4g.Info("#%d: %s\n", n, err)
		}),
	)

	if err != nil {
		l4g.Error(err)
		allure.FailNow(err)
	}
}
