package models

import (
	"errors"
	"git.sch9.ru/new_gate/ms-tester/internal/lib"
)

type Role int32

const (
	RoleSpectator   Role = 0
	RoleParticipant Role = 1
	RoleModerator   Role = 2
	RoleAdmin       Role = 3
)

func (role Role) IsAdmin() bool {
	return role == RoleAdmin
}

func (role Role) IsModerator() bool {
	return role == RoleModerator
}

func (role Role) IsParticipant() bool {
	return role == RoleParticipant
}

func (role Role) IsSpectator() bool {
	return role == RoleSpectator
}

func (role Role) AtLeast(other Role) bool {
	return role >= other
}

func (role Role) AtMost(other Role) bool {
	return role <= other
}

var ErrBadRole = errors.New("bad role")

func (role Role) Valid() error {
	switch role {
	case RoleSpectator, RoleParticipant, RoleModerator, RoleAdmin:
		return nil
	}
	return lib.ServiceError(ErrBadRole, lib.ErrValidationFailed, "bad role")
}

func (role Role) AsPointer() *Role {
	return &role
}
