package handlers

import (
	"fmt"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
	domain "github.com/haydenhargreaves/Potion/internal/domain/server"
)

func EngagementViewRecipe(ctx *gin.Context) {
	deps := ctx.MustGet("deps").(*domain.InjectedDependencies)
	recipeId, _ := strconv.Atoi(ctx.Param("id"))

	if !domain.IsLoggedIn(ctx) {
		if _, err := deps.EngagementService.ViewRecipe(recipeId); err != nil {
			ctx.JSON(http.StatusInternalServerError, gin.H{
				"status":  http.StatusInternalServerError,
				"message": err.Error(),
			})
		} else {
			ctx.Header("HX-Redirect", fmt.Sprintf(domain.WEB_RECIPE, recipeId))
			ctx.Status(http.StatusOK)
		}
		return
	}

	userId := ctx.MustGet("userId").(int)

	if _, err := deps.EngagementService.UserViewRecipe(userId, recipeId); err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"status":  http.StatusInternalServerError,
			"message": err.Error(),
		})
	} else {
		ctx.Header("HX-Redirect", fmt.Sprintf(domain.WEB_RECIPE, recipeId))
		ctx.Status(http.StatusOK)
	}
}

func EngagementShareRecipe(ctx *gin.Context) {
	deps := ctx.MustGet("deps").(*domain.InjectedDependencies)
	recipeId, _ := strconv.Atoi(ctx.Param("id"))

	if !domain.IsLoggedIn(ctx) {
		if _, err := deps.EngagementService.ShareRecipe(recipeId); err != nil {
			ctx.JSON(http.StatusInternalServerError, gin.H{
				"status":  http.StatusInternalServerError,
				"message": err.Error(),
			})
		} else {
			ctx.Status(http.StatusNoContent)
		}
		return
	}

	userId := ctx.MustGet("userId").(int)

	if _, err := deps.EngagementService.UserShareRecipe(userId, recipeId); err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"status":  http.StatusInternalServerError,
			"message": err.Error(),
		})
	} else {
		ctx.Status(http.StatusNoContent)
	}
}

func EngagementFavoriteRecipe(ctx *gin.Context) {
	deps := ctx.MustGet("deps").(*domain.InjectedDependencies)

	if !domain.IsLoggedIn(ctx) {
		ctx.Header("HX-Redirect", domain.WEB_LOGIN)
		ctx.Status(http.StatusOK)
		return
	}

	id := ctx.Param("id")
	recipeId, _ := strconv.Atoi(id)
	userId := ctx.MustGet("userId").(int)

	if _, err := deps.EngagementService.UserFavoriteRecipe(userId, recipeId); err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"status":  http.StatusInternalServerError,
			"message": err.Error(),
		})
	} else {
		ctx.Status(http.StatusNoContent)
	}
}

func EngagementMakeRecipe(ctx *gin.Context) {
	deps := ctx.MustGet("deps").(*domain.InjectedDependencies)

	if !domain.IsLoggedIn(ctx) {
		ctx.Header("HX-Redirect", domain.WEB_LOGIN)
		ctx.Status(http.StatusOK)
		return
	}

	id := ctx.Param("id")
	recipeId, _ := strconv.Atoi(id)
	userId := ctx.MustGet("userId").(int)

	if _, err := deps.EngagementService.UserMakeRecipe(userId, recipeId); err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"status":  http.StatusInternalServerError,
			"message": err.Error(),
		})
	} else {
		ctx.Status(http.StatusNoContent)
	}
}
