package controllers

import (
	"cds/dao"
	"fmt"

	"github.com/gofiber/fiber/v2"
	"go.mongodb.org/mongo-driver/mongo"
)

func GetUsers(c *fiber.Ctx) error {
	token := checkCookie(c)
	if token == "" {
		return c.SendStatus(fiber.StatusForbidden)
	} else {
		id := c.Params("id")
		group, err := dao.GetGroupById(id)
		if err == mongo.ErrNoDocuments {
			return c.SendStatus(fiber.StatusNotFound)
		} else if err != nil {
			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
				"error": fmt.Sprint(err),
			})
		} else {
			return c.Status(fiber.StatusOK).JSON(group)
		}
	}
}

// @Summary Renvoie les informations sur le compte se trouvant sur le cookie.
// @Produce json
// @Success 200 {object} models.User
// @Failure 403
// @Failure 404
// @Failure 500
// @Router /users/current [get]
func GetCurrentUser(c *fiber.Ctx) error {
	token := c.Cookies("token", "")
	if token == "" {
		return c.SendStatus(fiber.StatusForbidden)
	} else {
		user, err := dao.GetById(token)
		if err == mongo.ErrNoDocuments {
			return c.SendStatus(fiber.StatusNotFound)
		} else if err != nil {
			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
				"error": fmt.Sprint(err),
			})
		} else {
			return c.Status(fiber.StatusOK).JSON(user)
		}
	}
}

// @Summary Renvoie les informations sur le compte
// @Produce json
// @Success 200 {object} models.User
// @Failure 403
// @Failure 404
// @Failure 500
// @Router /users/{id} [get]
func GetUser(c *fiber.Ctx) error {
	token := checkCookie(c)
	if token == "" {
		return c.SendStatus(fiber.StatusForbidden)
	} else {
		id := c.Params("id")
		user, err := dao.GetById(id)
		if err == mongo.ErrNoDocuments {
			return c.SendStatus(fiber.StatusNotFound)
		} else if err != nil {
			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
				"error": fmt.Sprint(err),
			})
		} else {
			return c.Status(fiber.StatusOK).JSON(user)
		}
	}
}

// @Summary Renvoie la liste des groupes d'un utilisateur
// @Produce json
// @Success 200 {array} models.Group "Liste des ids des groupes"
// @Failure 403
// @Failure 404
// @Failure 500
// @Router /users/{id}/groups [get]
func GetGroupsUser(c *fiber.Ctx) error {
	token := checkCookie(c)
	if token == "" {
		return c.SendStatus(fiber.StatusForbidden)
	} else {
		id := c.Params("id")
		groups, err := dao.GetGroupByMember(id)
		if err == mongo.ErrNoDocuments {
			return c.SendStatus(fiber.StatusNotFound)
		} else if err != nil {
			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
				"error": fmt.Sprint(err),
			})
		} else {
			return c.Status(fiber.StatusOK).JSON(groups)
		}
	}
}