package handlers

import (
	"net/http"

	"github.com/rancher/steve/pkg/schemaserver/httperror"
	"github.com/rancher/steve/pkg/schemaserver/parse"
	"github.com/rancher/steve/pkg/schemaserver/types"
	"github.com/rancher/wrangler/pkg/schemas/validation"
)

func UpdateHandler(apiOp *types.APIRequest) (types.APIObject, error) {
	if err := apiOp.AccessControl.CanUpdate(apiOp, types.APIObject{}, apiOp.Schema); err != nil {
		return types.APIObject{}, err
	}

	var (
		data types.APIObject
		err  error
	)
	if apiOp.Method != http.MethodPatch {
		data, err = parse.Body(apiOp.Request)
		if err != nil {
			return types.APIObject{}, err
		}
	}

	store := apiOp.Schema.Store
	if store == nil {
		return types.APIObject{}, httperror.NewAPIError(validation.NotFound, "no store found")
	}

	data, err = store.Update(apiOp, apiOp.Schema, data, apiOp.Name)
	if err != nil {
		return types.APIObject{}, err
	}

	return data, nil
}