package admin

import (
	"github.com/pingcap/dbaas/central/db"
	"github.com/pingcap/dbaas/central/db/dbutil"
	"github.com/pingcap/dbaas/central/db/entity"
	"gorm.io/gorm"
)

type DevTierStats struct {
	AwsActiveClustersCount int64
	GcpActiveClustersCount int64
}

type DashboardStats struct {
	DevTier DevTierStats
}

func (m UserContext) GetDashboardStats() (*DashboardStats, error) {
	var (
		awsActiveClustersCount int64
		gcpActiveClustersCount int64
		err                    error
	)

	err = db.Transaction(func(tx *gorm.DB) error {
		awsActiveClustersCount, err = dbutil.GetProviderDevTierClustersCount(tx, entity.Aws)
		if err != nil {
			return err
		}
		gcpActiveClustersCount, err = dbutil.GetProviderDevTierClustersCount(tx, entity.Gcp)
		if err != nil {
			return err
		}
		return nil
	})
	if err != nil {
		return nil, err
	}
	return &DashboardStats{
		DevTier: DevTierStats{
			AwsActiveClustersCount: awsActiveClustersCount,
			GcpActiveClustersCount: gcpActiveClustersCount,
		},
	}, nil
}

type EnableDevTier struct {
	EnableOnAws bool
	EnableOnGcp bool
}

type SystemSettings struct {
	EnableDevTier EnableDevTier
}

func (m UserContext) GetSystemSettings() (*SystemSettings, error) {
	var (
		systemSetting *entity.SystemSetting
		err           error
	)

	err = db.Transaction(func(tx *gorm.DB) error {
		systemSetting, err = dbutil.GetSystemSettings(tx)
		if err != nil {
			return err
		}
		return nil
	})
	if err != nil {
		return nil, err
	}
	settings := systemSetting.Value

	return &SystemSettings{
		EnableDevTier: EnableDevTier{
			EnableOnAws: settings.EnableDevTier.EnableOnAws,
			EnableOnGcp: settings.EnableDevTier.EnableOnGcp,
		},
	}, nil
}

func (m UserContext) UpdateSystemSettings(settings *SystemSettings) (*SystemSettings, error) {
	var (
		systemSetting *entity.SystemSetting
		err           error
	)

	err = db.Transaction(func(tx *gorm.DB) error {
		systemSetting, err = dbutil.GetSystemSettings(tx)
		if err != nil {
			return err
		}
		systemSetting.Value = entity.SystemSettingValue{
			EnableDevTier: entity.EnableDevTier{
				EnableOnAws: settings.EnableDevTier.EnableOnAws,
				EnableOnGcp: settings.EnableDevTier.EnableOnGcp,
			},
		}
		return systemSetting.Update(tx, entity.SystemSettingDBSchema.Value)
	})
	if err != nil {
		return nil, err
	}
	return settings, nil
}
