package migrate

import (
	"github.com/pingcap/log"
	"github.com/tidbcloud/core-svc/model"
	"gorm.io/gorm"
)

// models owned by core-svc (TiDB-service Team), ref: https://pingcap.feishu.cn/wiki/wikcnw8Q9yIN4u8eCETvhv1Bxfg?sheet=toD5Ti
// NOTE: if any new table added (and owned by core-svc) team, do not forget to add them here.
var models = []interface{}{
	//cluster profiles
	&model.Provider{}, &model.Region{}, &model.Zone{},

	// simplify cluster tier
	&model.InfraProvider{}, &model.InfraCompute{}, &model.InfraStorage{},

	//tenant
	&model.Quota{}, &model.QuotaChangeLog{},
	&model.ProjectNetwork{},

	//cluster
	&model.Cluster{}, &model.Connection{}, &model.ClusterOperation{}, &model.ScaleOperationTracking{},
	&model.ClusterComponent{}, &model.ClusterSnapshot{},

	//old schema
	&model.ClusterCidr{}, &model.GcpVpcPeering{}, &model.AwsVpcPeering{},

	// integration
	&model.ClusterMetering{}, &model.BillingReportRecord{},

	// cross account
	&model.IamRole{}, &model.CrossAccountDeployment{}, &model.IamRoleUsage{},
}

func initCoreDB(db *gorm.DB) error {
	log.Info("init empty database with data")
	//create the tables in a empty database
	//it is 3 time faster than migrate model individually
	// NOTE: not all models defined in `model.go` are owned by core-svc, so we should NOT do the migration for them.
	if err := db.AutoMigrate(models...); err != nil {
		return err
	}
	log.Info("after create database tables")

	err := initProviders(db)
	if err != nil {
		return err
	}

	log.Info("after init empty database with data")
	return nil
}

var (
	awsCloudProvider = &model.Provider{
		Name: "aws",
		Regions: []*model.Region{
			{
				Name:        "us-west-2",
				DisplayName: "US-West-2 (Oregon)",
				Zones: []*model.Zone{
					{
						Name:        "us-west-2a",
						DisplayName: "us-west-2a",
					},
					{
						Name:        "us-west-2b",
						DisplayName: "us-west-2b",
					},
					{
						Name:        "us-west-2c",
						DisplayName: "us-west-2c",
					},
				},
				Status:            model.RegionStatusActive,
				DefaultBackupTime: "10:00",
			},
			{
				Name:        "us-east-1",
				DisplayName: "US-East-1 (Virginia)",
				Zones: []*model.Zone{
					{
						Name:        "us-east-1a",
						DisplayName: "us-east-1a",
					},
					{
						Name:        "us-east-1b",
						DisplayName: "us-east-1b",
					},
					{
						Name:        "us-east-1c",
						DisplayName: "us-east-1c",
					},
				},
				Status:            model.RegionStatusActive,
				DefaultBackupTime: "07:00",
			},
		},
		Status: model.ProviderStatusActive,
	}

	gcpCloudProvider = &model.Provider{
		Name: "gcp",
		Regions: []*model.Region{
			{
				Name:        "us-west1",
				DisplayName: "US-West1 (Oregon)",
				Zones: []*model.Zone{
					{
						Name:        "us-west1-a",
						DisplayName: "us-west1-a",
					},
					{
						Name:        "us-west1-b",
						DisplayName: "us-west1-b",
					},
					{
						Name:        "us-west1-c",
						DisplayName: "us-west1-c",
					},
				},
				Status:            model.RegionStatusActive,
				DefaultBackupTime: "10:00",
			},
			{
				Name:        "us-west2",
				DisplayName: "US-West2 (Oregon)",
				Zones: []*model.Zone{
					{
						Name:        "us-west2-a",
						DisplayName: "us-west2-a",
					},
					{
						Name:        "us-west2-b",
						DisplayName: "us-west2-b",
					},
					{
						Name:        "us-west2-c",
						DisplayName: "us-west2-c",
					},
				},
				Status:            model.RegionStatusActive,
				DefaultBackupTime: "10:00",
			},
		},
		Status: model.ProviderStatusActive,
	}
)

// nolint: deadcode
// init cloud providers and infra providers
func initProviders(db *gorm.DB) error {
	providers := []*model.Provider{
		awsCloudProvider,
		gcpCloudProvider,
	}

	if err := db.Create(providers).Error; err != nil {
		return err
	}

	infraProviders := []*model.InfraProvider{
		{
			Name:       "aws",
			DeployType: model.DeployTypeDedicated,
			ProviderID: awsCloudProvider.ID,
		},
		{
			Name:       "gcp",
			DeployType: model.DeployTypeDedicated,
			ProviderID: gcpCloudProvider.ID,
		},
		{
			Name:       "aws-free-tier",
			DeployType: model.DeployTypeShared,
			ProviderID: awsCloudProvider.ID,
		},
	}

	return db.Create(infraProviders).Error
}
