package handlers

import (
	"net/http"
	"strconv"

	"github.com/labstack/echo/v4"

	"github.com/treytartt/honeydue-api/internal/apperrors"
	"github.com/treytartt/honeydue-api/internal/middleware"
	"github.com/treytartt/honeydue-api/internal/services"
)

// UserHandler handles user-related HTTP requests
type UserHandler struct {
	userService *services.UserService
}

// NewUserHandler creates a new user handler
func NewUserHandler(userService *services.UserService) *UserHandler {
	return &UserHandler{
		userService: userService,
	}
}

// ListUsers handles GET /api/users/
func (h *UserHandler) ListUsers(c echo.Context) error {
	user, err := middleware.MustGetAuthUser(c)
	if err != nil {
		return err
	}

	// Only allow listing users that share residences with the current user
	users, err := h.userService.ListUsersInSharedResidences(user.ID)
	if err != nil {
		return err
	}

	return c.JSON(http.StatusOK, map[string]interface{}{
		"count":   len(users),
		"results": users,
	})
}

// GetUser handles GET /api/users/:id/
func (h *UserHandler) GetUser(c echo.Context) error {
	user, err := middleware.MustGetAuthUser(c)
	if err != nil {
		return err
	}

	userID, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		return apperrors.BadRequest("error.invalid_user_id")
	}

	// Can only view users that share a residence
	targetUser, err := h.userService.GetUserIfSharedResidence(uint(userID), user.ID)
	if err != nil {
		return err
	}

	return c.JSON(http.StatusOK, targetUser)
}

// ListProfiles handles GET /api/users/profiles/
func (h *UserHandler) ListProfiles(c echo.Context) error {
	user, err := middleware.MustGetAuthUser(c)
	if err != nil {
		return err
	}

	// List profiles of users in shared residences
	profiles, err := h.userService.ListProfilesInSharedResidences(user.ID)
	if err != nil {
		return err
	}

	return c.JSON(http.StatusOK, map[string]interface{}{
		"count":   len(profiles),
		"results": profiles,
	})
}
