package server

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

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

func (s *Server) GetUserV2(ctx *gin.Context) {
	id := ctx.Param("id")
	parsedId, err := strconv.Atoi(id)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{
			"status":  http.StatusBadRequest,
			"message": fmt.Sprintf("[ERROR] Failed to parse ID parameter. %s", err.Error()),
		})
		return
	}

	user, err := s.deps.UserService.GetUser(parsedId)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{
			"status":  http.StatusBadRequest,
			"message": fmt.Sprintf("[ERROR] Failed to get the target user. %s", err.Error()),
		})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{
		"status":  http.StatusOK,
		"message": "[OK] Successfully retrieved target user.",
		"user":    user,
	})
}

func (s *Server) GetAuthenticatedUserHandlerV2(ctx *gin.Context) {
	s.withAuthenticatedUser(ctx, func(ctx *gin.Context, user *domain.User) {
		ctx.JSON(http.StatusOK, gin.H{
			"status":  http.StatusOK,
			"message": "[OK] Successfully retrieved authenticated user.",
			"user":    user,
		})
	})
}

func (s *Server) GetAuthenicatedUserRecipesV2(ctx *gin.Context) {
	s.withAuthenticatedUser(ctx, func(ctx *gin.Context, user *domain.User) {
		recipes, err := s.deps.RecipeService.GetUserRecipes(user.Id)
		if err != nil {
			ctx.JSON(http.StatusBadRequest, gin.H{
				"status":  http.StatusBadRequest,
				"message": fmt.Sprintf("[ERROR] Could not fetch authenticated users's recipes. %s", err.Error()),
			})
			return
		}

		ctx.JSON(http.StatusOK, gin.H{
			"status":  http.StatusOK,
			"message": "[OK] Successfully retrieved authenticated user's recipes.",
			"recipes": recipes,
		})
	})
}

func (s *Server) GetAuthenicatedUserFavoritesV2(ctx *gin.Context) {
	s.withAuthenticatedUser(ctx, func(ctx *gin.Context, user *domain.User) {
		favorites, err := s.deps.RecipeService.GetUserFavoriteRecipes(user.Id)
		if err != nil {
			ctx.JSON(http.StatusBadRequest, gin.H{
				"status":  http.StatusBadRequest,
				"message": fmt.Sprintf("[ERROR] Could not fetch authenticated users's favorites. %s", err.Error()),
			})
			return
		}

		ctx.JSON(http.StatusOK, gin.H{
			"status":    http.StatusOK,
			"message":   "[OK] Successfully retrieved authenticated user's favorites.",
			"favorites": favorites,
		})
	})
}

func (s *Server) GetAuthenicatedUserEngagementV2(ctx *gin.Context) {
	s.withAuthenticatedUser(ctx, func(ctx *gin.Context, user *domain.User) {
		engagement, err := s.deps.EngagementService.GetUserEngagement(user.Id, 6)
		if err != nil {
			ctx.JSON(http.StatusBadRequest, gin.H{
				"status":  http.StatusBadRequest,
				"message": fmt.Sprintf("[ERROR] Failed to get authenticated user engagement. %s", err.Error()),
			})
			return
		}

		ctx.JSON(http.StatusOK, gin.H{
			"status":     http.StatusOK,
			"message":    "[OK] Successfully retrieved authenticated user engagement.",
			"engagement": engagement,
		})
	})
}

func (s *Server) GetAuthenicatedUserMadeRecipesV2(ctx *gin.Context) {
	s.withAuthenticatedUser(ctx, func(ctx *gin.Context, user *domain.User) {
		recipes, err := s.deps.RecipeService.GetUserMadeRecipes(user.Id, 6)
		if err != nil {
			ctx.JSON(http.StatusBadRequest, gin.H{
				"status":  http.StatusBadRequest,
				"message": fmt.Sprintf("[ERROR] Failed to get authenticated user's made recipes. %s", err.Error()),
			})
			return
		}

		ctx.JSON(http.StatusOK, gin.H{
			"status":  http.StatusOK,
			"message": "[OK] Successfully retrieved authenticated user's made recipes.",
			"recipes": recipes,
		})
	})
}

func (s *Server) GetAuthenicatedUserViewedRecipesV2(ctx *gin.Context) {
	s.withAuthenticatedUser(ctx, func(ctx *gin.Context, user *domain.User) {
		recipes, err := s.deps.RecipeService.GetUserViewedRecipes(user.Id, 6)
		if err != nil {
			ctx.JSON(http.StatusBadRequest, gin.H{
				"status":  http.StatusBadRequest,
				"message": fmt.Sprintf("[ERROR] Failed to get authenticated user's viewed recipes. %s", err.Error()),
			})
			return
		}

		ctx.JSON(http.StatusOK, gin.H{
			"status":  http.StatusOK,
			"message": "[OK] Successfully retrieved authenticated user's viewed recipes.",
			"recipes": recipes,
		})
	})
}
