package mysql

import (
	"context"

	"gorm.io/gorm"

	v1 "github.com/pingcap-inc/pchub/model/v1"
)

type cloudMemberRole struct {
	db *gorm.DB
}

func newCloudMemberRole(ds *datastore) *cloudMemberRole {
	return &cloudMemberRole{db: ds.db}
}

func (cm *cloudMemberRole) Gets(_ context.Context) ([]*v1.CloudMemberRole, error) {
	var res []*v1.CloudMemberRole
	d := cm.db.Find(&res)

	return res, dbNotFoundErrorWrap(d.Error)
}

func (cm *cloudMemberRole) ListByProviderCode(_ context.Context, code string) ([]*v1.CloudMemberRole, error) {
	var res []*v1.CloudMemberRole

	d := cm.db.Joins("Provider")
	if code != "" {
		if code == "gcp" {
			d = d.Where("cloud_member_role.code like ?", "basic%")
		}
		if code == "aws" {
			d = d.Where("cloud_member_role.id < ?", 33000) // 只选择原先的角色
		}
		if code == "alicloud" {
			// 阿里云只允许 admin, poweruser, readonly 角色
			d = d.Where("cloud_member_role.code IN (?)", []string{"admin", "poweruser", "readonly"})
		}
		d = d.Where("Provider.code = ?", code)
	}

	d = d.Find(&res)

	return res, dbNotFoundErrorWrap(d.Error)
}

func (cm *cloudMemberRole) ListByProviderName(_ context.Context, name string) ([]*v1.CloudMemberRole, error) {
	var res []*v1.CloudMemberRole

	d := cm.db.Joins("Provider")
	if name != "" {
		if name == "GCP" {
			d = d.Where("cloud_member_role.code like ?", "basic%")
		}
		d = d.Where("Provider.name = ?", name)
	}

	d = d.Find(&res)

	return res, dbNotFoundErrorWrap(d.Error)
}

func (cm *cloudMemberRole) ListByPro(_ context.Context, name string) ([]*v1.CloudMemberRole, error) {
	var res []*v1.CloudMemberRole
	d := cm.db.Joins("Provider").Where("Provider.name = ?", name).Find(&res)

	return res, dbNotFoundErrorWrap(d.Error)
}
