package mood

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

	"github.com/gorilla/mux"
)

type MoodRouter struct{}

func NewMoodRouter() *MoodRouter {
	return &MoodRouter{}
}

func (u *MoodRouter) RegisterRoutes(r *mux.Router) {
	r.Path("/").Methods(http.MethodGet).HandlerFunc(u.GetAll)
	r.Path("/{id}").Methods(http.MethodGet).HandlerFunc(u.Get)
	r.PathPrefix("/").Methods(http.MethodPost).HandlerFunc(u.Post)
	r.PathPrefix("/{id}").Methods(http.MethodPut).HandlerFunc(u.Put)
	r.Path("/{id}").Methods(http.MethodDelete).HandlerFunc(u.Delete)
}

func (u *MoodRouter) Get(rw http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)

	mood, err := findById(r.Context(), vars["id"])
	if err != nil {
		log.Printf("error finding mood by id: %s", err)
		rw.WriteHeader(http.StatusInternalServerError)
		return
	}

	bytes, err := json.Marshal(mood)
	if err != nil {
		log.Printf("error marshaling mood: %s", err)
		rw.WriteHeader(http.StatusInternalServerError)
		return
	}

	rw.Header().Set("Content-Type", "application/json")
	rw.Write(bytes)
}

func (u *MoodRouter) GetAll(rw http.ResponseWriter, r *http.Request) {
	mood, err := findAll(r.Context())
	if err != nil {
		log.Printf("error finding moods: %s", err)
		rw.WriteHeader(http.StatusInternalServerError)
		return
	}

	bytes, err := json.Marshal(mood)
	if err != nil {
		log.Printf("error marshaling moods: %s", err)
		rw.WriteHeader(http.StatusInternalServerError)
		return
	}

	rw.Header().Set("Content-Type", "application/json")
	rw.Write(bytes)
}

func (u *MoodRouter) Post(rw http.ResponseWriter, r *http.Request) {
	var mood Mood

	err := json.NewDecoder(r.Body).Decode(&mood)
	if err != nil {
		log.Printf("error decoding mood: %s", err)
		rw.WriteHeader(http.StatusInternalServerError)
		return
	}

	mood, err = create(r.Context(), &mood)
	if err != nil {
		log.Printf("error creating mood: %s", err)
		rw.WriteHeader(http.StatusInternalServerError)
		return
	}

	bytes, err := json.Marshal(mood)
	if err != nil {
		log.Printf("error marshaling mood: %s", err)
		rw.WriteHeader(http.StatusInternalServerError)
		return
	}

	rw.Header().Set("Content-Type", "application/json")
	rw.Write(bytes)
}

func (u *MoodRouter) Put(rw http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	var mood Mood

	err := json.NewDecoder(r.Body).Decode(&mood)
	if err != nil {
		log.Printf("error decoding mood: %s", err)
		rw.WriteHeader(http.StatusInternalServerError)
		return
	}

	mood, err = update(r.Context(), vars["id"], &mood)
	if err != nil {
		log.Printf("error creating mood: %s", err)
		rw.WriteHeader(http.StatusInternalServerError)
		return
	}

	bytes, err := json.Marshal(mood)
	if err != nil {
		log.Printf("error marshaling mood: %s", err)
		rw.WriteHeader(http.StatusInternalServerError)
		return
	}

	rw.Header().Set("Content-Type", "application/json")
	rw.Write(bytes)
}

func (u *MoodRouter) Delete(rw http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)

	err := delete(r.Context(), vars["id"])
	if err != nil {
		log.Printf("error finding mood by id: %s", err)
		rw.WriteHeader(http.StatusInternalServerError)
		return
	}

	rw.Header().Set("Content-Type", "application/json")
	rw.WriteHeader(http.StatusOK)
}