package projects

import (
	db "ttime/internal/database"

	"github.com/gofiber/fiber/v2"
	"github.com/gofiber/fiber/v2/log"
	"github.com/golang-jwt/jwt/v5"
)

func GetProjectTimesHandler(c *fiber.Ctx) error {
	// Get the username from the token
	user := c.Locals("user").(*jwt.Token)
	claims := user.Claims.(jwt.MapClaims)
	username := claims["name"].(string)

	// Get project
	projectName := c.Params("projectName")
	if projectName == "" {
		log.Info("No project name provided")
		return c.Status(400).SendString("No project name provided")
	}

	// Get all users in the project and roles
	userProjects, err := db.GetDb(c).GetAllUsersProject(projectName)
	if err != nil {
		log.Info("Error getting users in project:", err)
		return c.Status(500).SendString(err.Error())
	}

	// If the user is member
	isMember := false
	for _, userProject := range userProjects {
		if userProject.Username == username {
			isMember = true
			break
		}
	}

	// If the user is admin
	if !isMember {
		isAdmin, err := db.GetDb(c).IsSiteAdmin(username)
		if err != nil {
			log.Info("Error checking admin status:", err)
			return c.Status(500).SendString(err.Error())
		}
		if !isAdmin {
			log.Info("User is neither a project member nor a site admin:", username)
			return c.Status(403).SendString("User is neither a project member nor a site admin")
		}
	}

	// Get project times
	projectTimes, err := db.GetDb(c).GetProjectTimes(projectName)
	if err != nil {
		log.Info("Error getting project times:", err)
		return c.Status(500).SendString(err.Error())
	}

	// Return project times as JSON
	log.Info("Returning project times for project:", projectName)
	return c.JSON(projectTimes)
}