package server

import (
	"fmt"
	"github.com/goccy/go-json"
	"madsky.ru/go-tracker/internal/model/status"
	"madsky.ru/go-tracker/internal/model/user"
	"madsky.ru/go-tracker/internal/server/request"
	"madsky.ru/go-tracker/internal/server/response"
	"net/http"
)

func (app *Application) findStatuses(w http.ResponseWriter, r *http.Request) {
	ctx := r.Context()
	u := ctx.Value(UserContext{}).(*user.User)
	fmt.Println(u)

	s, err := app.Storage.Status.Find(app.Ctx)
	if err != nil {
		response.Error(w, err, http.StatusBadRequest)
		return
	}

	response.WriteJSON(w, nil, http.StatusOK, &s)
}

func (app *Application) FindStatusById(w http.ResponseWriter, r *http.Request) {
	id, err := request.Param(r, "id")
	if err != nil {
		response.Error(w, err, http.StatusBadRequest)
		return
	}

	s, err := app.Storage.Status.FindOne(app.Ctx, id)
	if err != nil {
		response.Error(w, err, http.StatusNotFound)
		return
	}

	response.WriteJSON(w, nil, http.StatusOK, &s)
}

func (app *Application) CreateStatus(w http.ResponseWriter, r *http.Request) {
	dec := json.NewDecoder(r.Body)
	dec.DisallowUnknownFields()

	var statusDto status.CreateStatusDTO

	err := dec.Decode(&statusDto)
	if err != nil {
		response.Error(w, err, http.StatusNotAcceptable)
		return
	}

	s, err := app.Storage.Status.Create(app.Ctx, &statusDto)
	if err != nil {
		response.Error(w, err, http.StatusBadRequest)
		return
	}

	response.WriteJSON(w, nil, http.StatusOK, &s)
}

func (app *Application) DeleteStatus(w http.ResponseWriter, r *http.Request) {
	id, err := request.Param(r, "id")
	if err != nil {
		response.Error(w, err, http.StatusBadRequest)
		return
	}

	count, err := app.Storage.Status.Remove(app.Ctx, id)
	if err != nil {
		response.Error(w, err, http.StatusBadRequest)
		return
	}

	response.WriteJSON(w, nil, http.StatusOK, count)
}
