package dbuser

import (
	"context"
	"time"

	"github.com/tidbcloud/account/internel/dao/entity"
	"gorm.io/gorm"
)

type DBUserDaoIface interface {
	//Dao() *DBUserDao

	// org_key
	CreateOrgKey(ctx context.Context, tx *gorm.DB, orgId uint64, keyId string, status entity.OrgKeyStatus) error
	ListOrgKeys(ctx context.Context, tx *gorm.DB, filter OrgKeyFilter) ([]entity.OrgKey, error)
	UpdateOrgKey(ctx context.Context, tx *gorm.DB, orgId uint64, keyId string, status entity.OrgKeyStatus) error
	DeleteOrgKey(ctx context.Context, tx *gorm.DB, orgId uint64) error

	// command_org_key
	CreateCommandOrgKey(ctx context.Context, tx *gorm.DB, orgId uint64, status entity.CommandStatus, action entity.CommandAction) error
	ListCommandOrgKeys(ctx context.Context, tx *gorm.DB, filter CommandOrgKeyFilter) ([]entity.CommandOrgKey, error)
	UpdateCommandOrgKey(ctx context.Context, tx *gorm.DB, orgId uint64, status entity.CommandStatus, action entity.CommandAction) error
	DeleteCommandOrgKey(ctx context.Context, tx *gorm.DB, orgId uint64) error

	// command_cluster_key
	CreateCommandClusterKey(ctx context.Context, tx *gorm.DB, orgId uint64, clusterId uint64, status entity.CommandStatus, action entity.CommandAction) error
	ListCommandClusterKeys(ctx context.Context, tx *gorm.DB, filter CommandClusterKeyFilter) ([]entity.CommandClusterKey, error)
	UpdateCommandClusterKey(ctx context.Context, tx *gorm.DB, e entity.CommandClusterKey) error
	DeleteCommandClusterKey(ctx context.Context, tx *gorm.DB, id uint64) error

	// user_action
	CreateCommandUserAction(ctx context.Context, tx *gorm.DB, operator uint64, userId uint64, email string, orgId uint64, projectId uint64, status entity.CommandStatus, action entity.CommandAction, targetType entity.TargetType, operatorType entity.TargetType) error
	ListCommandUserActions(ctx context.Context, tx *gorm.DB, filter CommandUserActionFilter) ([]entity.CommandUserAction, error)
	UpdateCommandUserAction(ctx context.Context, tx *gorm.DB, id uint64, operator uint64, userId uint64, orgId uint64, projectId uint64, status entity.CommandStatus, action entity.CommandAction) error

	// Command_DBUser_Cluster
	CreateCommandDBUserCluster(ctx context.Context, tx *gorm.DB, clusterId uint64, orgId uint64, operator uint64, userId uint64, dbUser string, status entity.CommandStatus, action entity.CommandAction, targetType entity.ClusterUserTargetType, dbRole string, operatorType entity.ClusterUserTargetType) error
	BatchCreateCommandDBUserCluster(ctx context.Context, tx *gorm.DB, objs []entity.CommandDBUserCluster) error
	CreateCommandDBUserClusterWithTime(ctx context.Context, tx *gorm.DB, clusterId uint64, orgId uint64, operator uint64, userId uint64, dbUser string, status entity.CommandStatus, action entity.CommandAction, targetType entity.ClusterUserTargetType, createTime time.Time, dbRole string, operatorType entity.ClusterUserTargetType) error
	ListCommandDBUserClusters(ctx context.Context, tx *gorm.DB, filter CommandDBUserClusterFilter) ([]entity.CommandDBUserCluster, error)
	UpdateCommandDBUserCluster(ctx context.Context, tx *gorm.DB, c entity.CommandDBUserCluster) error
	UpdateCommandDBUserPushing(ctx context.Context, tx *gorm.DB, id uint64, to uint32) error
	UpdateCommandDBUserPushingByFrom(ctx context.Context, tx *gorm.DB, id uint64, from, to uint32) error
}

type DBUserDao struct{}

func NewDBUserDao() DBUserDaoIface {
	return &DBUserDao{}
}

type OrgKeyFilter struct {
	OrgIDs []entity.ID
	Status []entity.OrgKeyStatus
}
type CommandOrgKeyFilter struct {
	OrgIDs  []entity.ID
	Actions []entity.CommandAction
	Status  []entity.CommandStatus
}

type CommandClusterKeyFilter struct {
	OrgIDs     []entity.ID
	ClusterIDs []entity.ID
	Actions    []entity.CommandAction
	Status     []entity.CommandStatus
}
type CommandUserActionFilter struct {
	Operator     []entity.ID
	UserIDs      []entity.ID
	OrgIDs       []entity.ID
	ProjectIDS   []entity.ID
	Actions      []entity.CommandAction
	Status       []entity.CommandStatus
	CreatedAtGte *time.Time
}

type CommandDBUserClusterFilter struct {
	IDs          []entity.ID
	OrgIDs       []entity.ID
	ClusterIDS   []entity.ID
	Operators    []entity.ID
	UserIDs      []entity.ID
	Actions      []entity.CommandAction
	Status       []entity.CommandStatus
	CreatedAtGte *time.Time
}
