package pathrule

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

	"github.com/google/uuid"
	"imuslab.com/zoraxy/mod/utils"
)

/*
	handler.go

	This script handles pathblock api
*/

func (h *Handler) HandleListBlockingPath(w http.ResponseWriter, r *http.Request) {
	js, _ := json.Marshal(h.BlockingPaths)
	utils.SendJSONResponse(w, string(js))
}

func (h *Handler) HandleAddBlockingPath(w http.ResponseWriter, r *http.Request) {
	matchingPath, err := utils.PostPara(r, "matchingPath")
	if err != nil {
		utils.SendErrorResponse(w, "invalid matching path given")
		return
	}

	exactMatch, err := utils.PostPara(r, "exactMatch")
	if err != nil {
		utils.SendErrorResponse(w, "invalid exact match value given")
		return
	}

	statusCodeString, err := utils.PostPara(r, "statusCode")
	if err != nil {
		utils.SendErrorResponse(w, "invalid status code given")
		return
	}

	statusCode, err := strconv.Atoi(statusCodeString)
	if err != nil {
		utils.SendErrorResponse(w, "invalid status code given")
		return
	}

	enabled, err := utils.PostPara(r, "enabled")
	if err != nil {
		utils.SendErrorResponse(w, "invalid enabled value given")
		return
	}

	caseSensitive, err := utils.PostPara(r, "caseSensitive")
	if err != nil {
		utils.SendErrorResponse(w, "invalid case sensitive value given")
		return
	}

	targetBlockingPath := BlockingPath{
		UUID:          uuid.New().String(),
		MatchingPath:  matchingPath,
		ExactMatch:    exactMatch == "true",
		StatusCode:    statusCode,
		CustomHeaders: http.Header{},
		CustomHTML:    []byte(""),
		Enabled:       enabled == "true",
		CaseSenitive:  caseSensitive == "true",
	}

	err = h.AddBlockingPath(&targetBlockingPath)
	if err != nil {
		utils.SendErrorResponse(w, err.Error())
		return
	}

	utils.SendOK(w)
}

func (h *Handler) HandleRemoveBlockingPath(w http.ResponseWriter, r *http.Request) {
	blockerUUID, err := utils.PostPara(r, "uuid")
	if err != nil {
		utils.SendErrorResponse(w, "invalid uuid given")
		return
	}

	targetRule := h.GetPathBlockerFromUUID(blockerUUID)
	if targetRule == nil {
		//Not found
		utils.SendErrorResponse(w, "target path blocker not found")
		return
	}

	err = h.RemoveBlockingPathByUUID(blockerUUID)
	if err != nil {
		utils.SendErrorResponse(w, err.Error())
		return
	}
	utils.SendOK(w)
}