package api

import (
	"encoding/json"
	"net/http"
	"github.com/gorilla/mux"
)

type StakeRequest struct {
	Address  string `json:"address"`
	Amount   uint64 `json:"amount"`
	Duration int64  `json:"duration"`
}

type UnstakeRequest struct {
	Address string `json:"address"`
}

func (h *Handler) StakeHandler(w http.ResponseWriter, r *http.Request) {
	var req StakeRequest
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		WriteError(w, http.StatusBadRequest, "Invalid request")
		return
	}
	if err := h.StakingStore.Stake(req.Address, req.Amount, uint64(req.Duration)); err != nil {
		WriteError(w, http.StatusInternalServerError, "Failed to stake")
		return
	}
	WriteJSON(w, map[string]string{"message": "Stake registered successfully"})
}

func (h *Handler) UnstakeHandler(w http.ResponseWriter, r *http.Request) {
	var req UnstakeRequest
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		WriteError(w, http.StatusBadRequest, "Invalid request")
		return
	}
	if err := h.StakingStore.Unstake(req.Address); err != nil {
		WriteError(w, http.StatusInternalServerError, "Failed to unstake")
		return
	}
	WriteJSON(w, map[string]string{"message": "Unstake successful"})
}

func (h *Handler) GetStakeInfo(w http.ResponseWriter, r *http.Request) {
	address := mux.Vars(r)["address"]
	info, ok := h.StakingStore.GetStakeInfo(address)
	if !ok {
		WriteError(w, http.StatusNotFound, "Stake info not found")
		return
	}
	WriteJSON(w, info)
}