package handler

import (
	"encoding/json"
	"log"
	"net/http"
	"strconv"
	"websocket-server/internal/service"
	ws "websocket-server/pkg/websocket"

	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
	CheckOrigin: func(r *http.Request) bool {
		return true
	},
}

type WebSocketHandler struct {
	hub           *ws.Hub
	marketService *service.MarketService
}

func NewWebSocketHandler(hub *ws.Hub, marketService *service.MarketService) *WebSocketHandler {
	return &WebSocketHandler{
		hub:           hub,
		marketService: marketService,
	}
}

func (h *WebSocketHandler) HandleWebSocket(w http.ResponseWriter, r *http.Request) {
	limitStr := r.URL.Query().Get("limit")
	limit := 10
	if limitStr != "" {
		if parsedLimit, err := strconv.Atoi(limitStr); err == nil && parsedLimit > 0 && parsedLimit <= 1000 {
			limit = parsedLimit
		}
	}

	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println("Upgrade error:", err)
		return
	}

	client := &ws.Client{
		Hub:   h.hub,
		Conn:  conn,
		Send:  make(chan []byte, 256),
		Limit: limit,
	}

	client.Hub.Register <- client

	go func() {
		buyOrders, sellOrders, err := h.marketService.GetInitialData(limit)
		if err == nil {
			initialData := map[string]interface{}{
				"type":        "initial",
				"buy_orders":  buyOrders,
				"sell_orders": sellOrders,
			}
			data, _ := json.Marshal(initialData)
			client.Send <- data
		}
	}()

	go client.WritePump()
	go client.ReadPump()
}
