package handler

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

	"Engine/internal/database"
	"Engine/internal/model"
)

type ActualsHandler struct {
	repo *database.ActualsRepo
}

func NewActualsHandler(repo *database.ActualsRepo) *ActualsHandler {
	return &ActualsHandler{repo: repo}
}

func (h *ActualsHandler) Ingest(w http.ResponseWriter, r *http.Request) {
	var req model.IngestActualsRequest
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		writeError(w, http.StatusBadRequest, "invalid request body")
		return
	}

	errs := req.Valid()
	if len(errs) > 0 {
		writeError(w, http.StatusBadRequest, strings.Join(errs, "; "))
		return
	}

	actual, err := h.repo.Ingest(r.Context(), req)
	if err != nil {
		writeError(w, http.StatusInternalServerError, err.Error())
		return
	}

	writeJSON(w, http.StatusCreated, actual)
}

func (h *ActualsHandler) IngestBatch(w http.ResponseWriter, r *http.Request) {
	var req []model.IngestActualsRequest
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		writeError(w, http.StatusBadRequest, "invalid request body")
		return
	}
	var errs []string
	for _, atual := range req {
		errs = append(errs, atual.Valid()...)
	}

	if len(errs) > 0 {
		writeError(w, http.StatusBadRequest, strings.Join(errs, "; "))
		return
	}

	actual, err := h.repo.IngestBatch(r.Context(), req)
	if err != nil {
		writeError(w, http.StatusInternalServerError, err.Error())
		return
	}

	writeJSON(w, http.StatusCreated, actual)
}
