package common

import (
	"context"
	"strconv"
	"time"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"

	"github.com/tidbcloud/eks-provider/controllers/cluster/task"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
)

const (
	randomLen = 6
	// 36 = len(0-9) + len(a-z)
	formatBase = 36
)

var (
	timestampStartPoint = time.Date(2022, time.January, 0, 0, 0, 0, 0, time.UTC)
)

func newDefaultDNSIdentity() string {
	n := time.Now().UTC().Unix() - timestampStartPoint.Unix()
	s := strconv.FormatInt(n, formatBase)

	return cloudv1.RandomString(randomLen) + s
}

// DNS set default dns identity of the cluster.
type DNS struct {
	*task.BaseTask
}

func NewDNS(ctx *task.Context) *DNS {
	return &DNS{BaseTask: &task.BaseTask{Context: ctx}}
}

func (t *DNS) Name() string {
	return "DNS"
}

func (t *DNS) Create(ctx context.Context) deploy.Result {
	changed := t.setIdentity(&t.Cluster.Spec.SqlEndpoints)

	for i := range t.Cluster.Spec.ExtraGroups {
		group := &t.Cluster.Spec.ExtraGroups[i]
		if t.setIdentity(&group.SqlEndpoints) {
			changed = true
		}
	}

	if changed {
		return deploy.Panic(nil).WithRequeuAfter(0)
	}

	return deploy.Done()
}

func (t *DNS) setIdentity(ep *cloudv1.SqlEndpoints) bool {
	if ep.DNS.Identity != "" {
		return false
	}

	ep.DNS.Identity = newDefaultDNSIdentity()
	return true
}

func (t *DNS) Delete(ctx context.Context) deploy.Result {
	return deploy.Done()
}
