// cmd/server/main.go
package main

import (
	"log"
	"net/http"
	"websocket-server/internal/config"
	"websocket-server/internal/handler"
	"websocket-server/internal/repository"
	"websocket-server/internal/service"
	"websocket-server/pkg/websocket"
)

func main() {
	cfg := config.Load()

	db, err := config.ConnectDB(cfg)
	if err != nil {
		log.Fatal("Failed to connect to database:", err)
	}

	redisClient := config.ConnectRedis(cfg)

	orderRepo := repository.NewOrderRepository(db)

	marketService := service.NewMarketService(orderRepo, redisClient, cfg.TimeThreshold)

	hub := websocket.NewHub()
	go hub.Run()

	go marketService.BroadcastOrders(hub)
	go marketService.ListenForMatches(hub)

	wsHandler := handler.NewWebSocketHandler(hub, marketService)

	// Chat setup
	chatRepo := repository.NewChatRepository(db)
	chatService := service.NewChatService(chatRepo, redisClient)
	chatHub := websocket.NewChatHub()
	go chatHub.Run()
	chatHandler := handler.NewChatHandler(chatService, chatHub)

	// Order endpoints
	http.HandleFunc("/ws", wsHandler.HandleWebSocket)

	// Chat endpoints
	http.HandleFunc("/chat/ws", chatHandler.HandleWebSocket)
	http.HandleFunc("/chat/send", chatHandler.SendMessage)
	http.HandleFunc("/chat/history", chatHandler.GetHistory)
	http.HandleFunc("/chat/mark-read", chatHandler.MarkAsRead)
	http.HandleFunc("/chat/rooms", chatHandler.GetRooms)

	log.Printf("WebSocket server starting on %s (time threshold: %s)", cfg.ServerAddress, cfg.TimeThreshold)
	if err := http.ListenAndServe(cfg.ServerAddress, nil); err != nil {
		log.Fatal("Server failed:", err)
	}
}
