package state

type State struct {
	banned map[string]string // IP -> session ID (that banned it)
	locked map[string]string // resource name -> session ID (that locked it)
}

func New() *State {
	return &State{
		banned: make(map[string]string),
		locked: make(map[string]string),
	}
}

// Ban

func (s *State) Ban(ip, id string) {
	s.banned[ip] = id
}

func (s *State) Unban(ip string) {
	delete(s.banned, ip)
}

func (s *State) IsBanned(ip string) bool {
	_, ok := s.banned[ip]
	return ok
}

func (s *State) GetBanned(ip string) (string, bool) {
	id, ok := s.banned[ip]
	return id, ok
}

func (s *State) AllBanned() map[string]string {
	return s.banned
}

// Lock

func (s *State) Lock(resource, id string) {
	s.locked[resource] = id
}

func (s *State) Unlock(resource string) {
	delete(s.locked, resource)
}

func (s *State) IsLocked(resource string) bool {
	_, ok := s.locked[resource]
	return ok
}

func (s *State) GetLocked(resource string) (string, bool) {
	id, ok := s.locked[resource]
	return id, ok
}

func (s *State) AllLocked() map[string]string {
	return s.locked
}