package transport

import (
	"net"
	"sync"

	"go.uber.org/zap"
)

// ConnManager 连接管理器
// 维护 peer_key → net.Conn 的映射关系
type ConnManager struct {
	conns  map[string]net.Conn
	mu     sync.RWMutex
	logger *zap.Logger
}

// NewConnManager 创建连接管理器
func NewConnManager(logger *zap.Logger) *ConnManager {
	return &ConnManager{
		conns:  make(map[string]net.Conn),
		logger: logger,
	}
}

// Add 添加连接
func (m *ConnManager) Add(peerKey string, conn net.Conn) {
	m.mu.Lock()
	defer m.mu.Unlock()

	// 如果已存在，先关闭旧连接
	if oldConn, ok := m.conns[peerKey]; ok {
		oldConn.Close()
		m.logger.Debug("关闭旧连接", zap.String("peer_key", peerKey))
	}

	m.conns[peerKey] = conn
	m.logger.Info("添加新连接",
		zap.String("peer_key", peerKey),
		zap.String("remote_addr", conn.RemoteAddr().String()))
}

// Get 获取连接
func (m *ConnManager) Get(peerKey string) (net.Conn, bool) {
	m.mu.RLock()
	defer m.mu.RUnlock()

	conn, ok := m.conns[peerKey]
	return conn, ok
}

// Remove 移除连接
func (m *ConnManager) Remove(peerKey string) {
	m.mu.Lock()
	defer m.mu.Unlock()

	if conn, ok := m.conns[peerKey]; ok {
		conn.Close()
		delete(m.conns, peerKey)
		m.logger.Info("移除连接", zap.String("peer_key", peerKey))
	}
}

// Count 获取连接数量
func (m *ConnManager) Count() int {
	m.mu.RLock()
	defer m.mu.RUnlock()
	return len(m.conns)
}

// CloseAll 关闭所有连接
func (m *ConnManager) CloseAll() {
	m.mu.Lock()
	defer m.mu.Unlock()

	for peerKey, conn := range m.conns {
		conn.Close()
		m.logger.Debug("关闭连接", zap.String("peer_key", peerKey))
	}

	m.conns = make(map[string]net.Conn)
}

// List 列出所有连接（返回副本）
func (m *ConnManager) List() map[string]net.Conn {
	m.mu.RLock()
	defer m.mu.RUnlock()

	result := make(map[string]net.Conn)
	for k, v := range m.conns {
		result[k] = v
	}
	return result
}

// GetAll 获取所有连接（同 List，为了兼容）
func (m *ConnManager) GetAll() map[string]net.Conn {
	return m.List()
}
