package integration

import (
	"context"
	"fmt"
	"math/rand"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/types"
	"k8s.io/utils/ptr"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

const (
	instanceType  = "standard-8c"
	instanceType2 = "standard-16c"
)

func getClusterRevision(cli client.Client, clusterRef types.NamespacedName) (*cloudv1.ConfigRevision, error) {
	c := &cloudv1.Cluster{}
	err := cli.Get(context.TODO(), clusterRef, c)
	if err != nil {
		return nil, err
	}
	rev := &cloudv1.ConfigRevision{}
	err = cli.Get(context.TODO(), types.NamespacedName{Name: c.Spec.ConfigRevisionRef.Name}, rev)
	if err != nil {
		return nil, err
	}
	return rev, nil
}

func newClusterRevision(cluster *cloudv1.Cluster) *cloudv1.ConfigRevision {
	rev := &cloudv1.ConfigRevision{
		ObjectMeta: metav1.ObjectMeta{
			Name: fmt.Sprintf("cr-%d", rand.Int()),
			Labels: map[string]string{
				cloudv1.ClusterTagKey: cluster.Name,
				cloudv1.ProjectTagKey: cluster.GetProjectID(),
				cloudv1.TenantTagKey:  cluster.GetTenantID(),
			},
		},
		Spec: cloudv1.ConfigRevisionSpec{
			Version: "v7.1.1",
		},
	}
	return rev
}

func createInitialConfigRevision(ctx context.Context, cli client.Client, cluster *cloudv1.Cluster) (*cloudv1.ConfigRevision, error) {
	cr := &cloudv1.ConfigRevision{
		ObjectMeta: metav1.ObjectMeta{
			Name: fmt.Sprintf("cr-%d", rand.Int()),
			Labels: map[string]string{
				cloudv1.ClusterTagKey: cluster.Name,
				cloudv1.ProjectTagKey: cluster.GetProjectID(),
				cloudv1.TenantTagKey:  cluster.GetTenantID(),
			},
			Annotations: map[string]string{
				"placeholder": "placeholder",
			},
		},
		Spec: cloudv1.ConfigRevisionSpec{
			Version: "v7.1.1",
			TiDB: &cloudv1.Configuration{
				BaseImage: ptr.To("v5.2.0-20210827"),
				Tag:       nil,
				Config: cloudv1.NewTomlConfig(map[string]interface{}{
					"log": map[string]interface{}{
						"level": "info",
					},
				}),
			},
			PD: &cloudv1.Configuration{
				BaseImage: ptr.To("v5.2.0-20210827"),
				Tag:       nil,
				Config: cloudv1.NewTomlConfig(map[string]interface{}{
					"log": map[string]interface{}{
						"level": "info",
					},
				}),
			},
			TiKV: &cloudv1.Configuration{
				BaseImage: ptr.To("v5.2.0-20210827"),
				Tag:       nil,
				Config: cloudv1.NewTomlConfig(map[string]interface{}{
					"log": map[string]interface{}{
						"level": "info",
					},
				}),
			},
			TiFlash: &cloudv1.Configuration{
				BaseImage: ptr.To("v5.2.0-20210827"),
				Tag:       nil,
				Config: cloudv1.NewTomlConfig(map[string]interface{}{
					"log": map[string]interface{}{
						"level": "info",
					},
				}),
			},
			TiFlashLearner: &cloudv1.Configuration{
				BaseImage: ptr.To("v5.2.0-20210827"),
				Tag:       nil,
				Config: cloudv1.NewTomlConfig(map[string]interface{}{
					"log": map[string]interface{}{
						"level": "info",
					},
				}),
			},
		},
	}

	if err := cli.Create(ctx, cr); err != nil {
		return nil, err
	}
	return cr, nil
}
