// package wgname -- ожидатель группы по имени для завершения
package wgname

import (
	"fmt"
	"sync"

	"wartank/pkg/components/safe_bool"
)

// WgName -- ожидатель группы завершения
type WgName struct {
	dictName map[string]bool     // Словарь имён потоков
	chEnd    chan int            // Канал сигнала закрытия ожидания
	isWork   *safe_bool.БезопБул // Признак работы ожидания
	block    sync.RWMutex
}

// NewWgName -- возвращает новый ожидатель группы
func NewWgName() *WgName {
	сам := &WgName{
		dictName: make(map[string]bool),
		chEnd:    make(chan int, 1),
		isWork:   safe_bool.НовБезопБул(),
	}
	сам.isWork.Уст()
	return сам
}

// Add -- добавляет имя в группу ожидания
func (сам *WgName) Add(name string) error {
	сам.block.Lock()
	defer сам.block.Unlock()
	_, isOk := сам.dictName[name]
	if isOk {
		return fmt.Errorf("WgName.Add(): name %q already exists", name)
	}
	сам.dictName[name] = true
	return nil
}

// Done -- отмечает словарь ожидания готовности потока
func (сам *WgName) Done(name string) error {
	сам.block.Lock()
	defer сам.block.Unlock()
	_, isOk := сам.dictName[name]
	if !isOk {
		return fmt.Errorf("WgName.Done(): name %q not exists", name)
	}
	delete(сам.dictName, name)
	if !сам.isWork.Получ() {
		return nil
	}
	if len(сам.dictName) == 0 {
		сам.isWork.Сброс()
		close(сам.chEnd)
	}
	return nil
}

// Wait -- ожидание закрытия группы
func (сам *WgName) Wait() {
	<-сам.chEnd
}
