// Package balance...
//
// Description : balance...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-10-19 2:26 下午
package balance

import (
	"errors"
	"sync"

	"git.zhangdeman.cn/zhangdeman/gopkg/balance/define"
)

// base ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:26 下午 2021/10/19
type base struct {
	lock      *sync.RWMutex
	severList []*define.ServerNode
}

// Lock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:27 下午 2021/10/19
func (b *base) Lock() {
	b.lock.Lock()
}

// Unlock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:27 下午 2021/10/19
func (b *base) Unlock() {
	b.lock.Unlock()
}

// RLock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:28 下午 2021/10/19
func (b *base) RLock() {
	b.lock.RLock()
}

// RUnlock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:28 下午 2021/10/19
func (b *base) RUnlock() {
	b.lock.RUnlock()
}

// AddServerNode 新添加一个服务器节点
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:07 下午 2021/10/20
func (b *base) AddServerNode(node *define.ServerNode) error {
	if len(node.HostIP) == 0 || node.Port <= 0 {
		return errors.New("host ip or port is invalid")
	}
	b.Lock()
	defer b.Unlock()
	for _, item := range b.severList {
		if item.HostIP == node.HostIP && item.Port == node.Port {
			return errors.New("host config is already exist")
		}
	}
	b.severList = append(b.severList, node)
	return nil
}

// Remove 移除一个节点, force = true , 强制删除, force = false 逻辑删除, 设置状态
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:19 下午 2021/10/20
func (b *base) Remove(hostIP string, port int, force bool) {
	b.Lock()
	defer b.Unlock()
	tmpServerNode := make([]*define.ServerNode, 0)
	for _, item := range b.severList {
		if item.HostIP == hostIP && item.Port == port {
			if force {
				continue
			}
			item.Status = define.ServerNodeStatusRemove
		}
		tmpServerNode = append(tmpServerNode, item)
	}
	b.severList = tmpServerNode
}

// GetServerNodeList 获取服务器节点
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:33 下午 2021/10/20
func (b *base) GetServerNodeList() []*define.ServerNode {
	return b.severList
}