package handlers

import (
	"ttime/internal/database"

	"github.com/gofiber/fiber/v2"
)

// The actual interface that we will use
type GlobalState interface {
	Register(c *fiber.Ctx) error        // To register a new user
	UserDelete(c *fiber.Ctx) error      // To delete a user
	Login(c *fiber.Ctx) error           // To get the token
	LoginRenew(c *fiber.Ctx) error      // To renew the token
	CreateProject(c *fiber.Ctx) error   // To create a new project
	GetUserProjects(c *fiber.Ctx) error // To get all projects
	SubmitWeeklyReport(c *fiber.Ctx) error
	GetWeeklyReport(c *fiber.Ctx) error
	SignReport(c *fiber.Ctx) error
	GetProject(c *fiber.Ctx) error
	AddUserToProjectHandler(c *fiber.Ctx) error
	PromoteToAdmin(c *fiber.Ctx) error
	GetWeeklyReportsUserHandler(c *fiber.Ctx) error
	IsProjectManagerHandler(c *fiber.Ctx) error
	// UpdateProject(c *fiber.Ctx) error        // To update a project // WIP
	DeleteProject(c *fiber.Ctx) error // To delete a project // WIP
	// CreateTask(c *fiber.Ctx) error           // To create a new task // WIP
	// GetTasks(c *fiber.Ctx) error             // To get all tasks // WIP
	// GetTask(c *fiber.Ctx) error              // To get a specific task // WIP
	// UpdateTask(c *fiber.Ctx) error           // To update a task // WIP
	// DeleteTask(c *fiber.Ctx) error           // To delete a task // WIP
	// CreateCollection(c *fiber.Ctx) error     // To create a new collection // WIP
	// GetCollections(c *fiber.Ctx) error       // To get all collections // WIP
	// GetCollection(c *fiber.Ctx) error        // To get a specific collection // WIP
	// UpdateCollection(c *fiber.Ctx) error     // To update a collection // WIP
	// DeleteCollection(c *fiber.Ctx) error     // To delete a collection // WIP
	// SignCollection(c *fiber.Ctx) error       // To sign a collection // WIP
	ListAllUsers(c *fiber.Ctx) error        // To get a list of all users in the application database
	ListAllUsersProject(c *fiber.Ctx) error // To get a list of all users for a specific project
	ProjectRoleChange(c *fiber.Ctx) error   // To change a users role in a project
}

// "Constructor"
func NewGlobalState(db database.Database) GlobalState {
	return &GState{Db: db}
}

// The global state, which implements all the handlers
type GState struct {
	Db database.Database
}