package handlers

import (
	"encoding/json"
	"net/http"
	"strings"

	"github.com/user/nanometrics/server/db"
	"github.com/user/nanometrics/server/models"
)

func AgentConfigHandler(database *db.DB, pushConfig func(agentID string, cfg *models.AgentConfig)) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		parts := strings.Split(strings.Trim(r.URL.Path, "/"), "/")
		if len(parts) < 4 {
			http.Error(w, "invalid path", 400)
			return
		}
		agentID := parts[2]

		switch r.Method {
		case http.MethodGet:
			cfg, err := database.GetAgentConfig(agentID)
			if err != nil {
				http.Error(w, err.Error(), 500)
				return
			}
			if cfg == nil {
				cfg = models.DefaultAgentConfig()
			}
			w.Header().Set("Content-Type", "application/json")
			json.NewEncoder(w).Encode(cfg)

		case http.MethodPut:
			var cfg models.AgentConfig
			if err := json.NewDecoder(r.Body).Decode(&cfg); err != nil {
				http.Error(w, err.Error(), 400)
				return
			}
			if err := database.UpsertAgentConfig(agentID, &cfg); err != nil {
				http.Error(w, err.Error(), 500)
				return
			}
			if pushConfig != nil {
				go pushConfig(agentID, &cfg)
			}
			w.WriteHeader(http.StatusNoContent)

		default:
			http.Error(w, "method not allowed", 405)
		}
	}
}

func ServerConfigHandler(database *db.DB) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodGet:
			cfg, err := database.GetServerConfig()
			if err != nil {
				http.Error(w, err.Error(), 500)
				return
			}
			w.Header().Set("Content-Type", "application/json")
			json.NewEncoder(w).Encode(cfg)

		case http.MethodPut:
			var cfg models.ServerConfig
			if err := json.NewDecoder(r.Body).Decode(&cfg); err != nil {
				http.Error(w, err.Error(), 400)
				return
			}
			if err := database.SetServerConfig(cfg); err != nil {
				http.Error(w, err.Error(), 500)
				return
			}
			w.WriteHeader(http.StatusNoContent)

		default:
			http.Error(w, "method not allowed", 405)
		}
	}
}
