package project

import (
	"context"

	"github.com/pingcap/dbaas/central/db"
	"github.com/pingcap/dbaas/central/db/entity"
	infraapi "github.com/pingcap/dbaas/central/infra-api"
	"github.com/pingcap/dbaas/pkg/constants"
	"gorm.io/gorm"
)

type RegionCIDR struct {
	Region     string
	RegionName string
	CIDR       string
	Active     bool
}

func GetProjectNetwork(ctx context.Context, projectID, providerID entity.ID) (*entity.ProjectNetwork, error) {
	var (
		projectNetwork entity.ProjectNetwork
		err            error
	)

	err = db.Transaction(func(tx *gorm.DB) error {
		return entity.NewProjectNetworkQuerySet(tx).ProjectIDEq(projectID).ProviderIDEq(providerID).One(&projectNetwork)
	})

	return &projectNetwork, err
}

func CreateProjectNetwork(ctx context.Context, projectID, providerID entity.ID, CIDR string) (*entity.ProjectNetwork, error) {
	projectNetwork := entity.ProjectNetwork{
		ProjectID:  projectID,
		ProviderID: providerID,
		CIDR:       CIDR,
	}

	err := db.Transaction(func(tx *gorm.DB) error {
		return projectNetwork.Create(tx)
	})

	return &projectNetwork, err
}

func GetDefaultCIDR() string {
	return constants.DefaultProjectCIDR
}

func GetRegionCIDRFromInfraAPI(ctx context.Context, api *infraapi.API, provider entity.Provider, projectID entity.ID, region string) (string, error) {
	network, err := api.GetNetwork(ctx, provider.Name.String(), projectID.Uint64(), region)
	if err != nil {
		return "", err
	}

	return network.Spec.CIDR, nil
}
