// pkg/websocket/chat_hub.go
package websocket

import (
	"log"
	"sync"
)

type ChatHub struct {
	// Map of customerID -> ChatClient
	Clients    map[string]*ChatClient
	Register   chan *ChatClient
	Unregister chan *ChatClient
	SendTo     chan *DirectMessage
	Mu         sync.RWMutex
}

type DirectMessage struct {
	ReceiverID string
	Message    []byte
}

func NewChatHub() *ChatHub {
	return &ChatHub{
		Clients:    make(map[string]*ChatClient),
		Register:   make(chan *ChatClient),
		Unregister: make(chan *ChatClient),
		SendTo:     make(chan *DirectMessage, 256),
	}
}

func (h *ChatHub) Run() {
	for {
		select {
		case client := <-h.Register:
			h.Mu.Lock()
			h.Clients[client.CustomerID] = client
			h.Mu.Unlock()
			log.Printf("Chat client connected. CustomerID: %s, Total: %d", client.CustomerID, len(h.Clients))

		case client := <-h.Unregister:
			h.Mu.Lock()
			if _, ok := h.Clients[client.CustomerID]; ok {
				delete(h.Clients, client.CustomerID)
				close(client.Send)
				log.Printf("Chat client disconnected. CustomerID: %s, Total: %d", client.CustomerID, len(h.Clients))
			}
			h.Mu.Unlock()

		case dm := <-h.SendTo:
			h.Mu.RLock()
			if client, ok := h.Clients[dm.ReceiverID]; ok {
				select {
				case client.Send <- dm.Message:
				default:
					log.Printf("Client %s send buffer full, skipping message", dm.ReceiverID)
				}
			}
			h.Mu.RUnlock()
		}
	}
}

// SendToUser sends a message to a specific customer
func (h *ChatHub) SendToUser(customerID string, message []byte) {
	h.SendTo <- &DirectMessage{
		ReceiverID: customerID,
		Message:    message,
	}
}

