package activity

import (
	"strconv"
	"strings"
	"system-altrak/pkg/utils"

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

type restoreRequest struct {
	Resource string `json:"resource"`
	ID       uint   `json:"id"`
}

type Handler struct {
	service ActivityService
}

func NewHandler(s ActivityService) *Handler {
	return &Handler{service: s}
}

func (h *Handler) List(c *fiber.Ctx) error {
	branchID, _ := c.Locals("current_branch_id").(uint)
	role, _ := c.Locals("role").(string)
	logs, err := h.service.List(branchID, role)
	if err != nil {
		return utils.InternalErrorResponse(c, "Failed to aggregate historical activity audit logs")
	}
	return utils.SuccessResponse(c, "Audit logs synchronized successfully", logs)
}

func (h *Handler) Dashboard(c *fiber.Ctx) error {
	branchID, _ := c.Locals("current_branch_id").(uint)
	role, _ := c.Locals("role").(string)
	dashboard, err := h.service.Dashboard(branchID, role)
	if err != nil {
		return utils.InternalErrorResponse(c, "Failed to aggregate audit dashboard")
	}
	return utils.SuccessResponse(c, "Audit dashboard synchronized successfully", dashboard)
}

func (h *Handler) Restore(c *fiber.Ctx) error {
	var req restoreRequest
	if err := c.BodyParser(&req); err != nil {
		return utils.ErrorResponse(c, fiber.StatusBadRequest, "Invalid JSON data structure format")
	}

	req.Resource = strings.TrimSpace(req.Resource)
	if req.ID == 0 {
		if rawID := strings.TrimSpace(c.Query("id")); rawID != "" {
			parsedID, err := strconv.ParseUint(rawID, 10, 32)
			if err == nil && parsedID > 0 {
				req.ID = uint(parsedID)
			}
		}
	}

	if req.Resource == "" || req.ID == 0 {
		return utils.ErrorResponse(c, fiber.StatusBadRequest, "Resource and ID are required")
	}

	branchID, _ := c.Locals("current_branch_id").(uint)
	role, _ := c.Locals("role").(string)
	if err := h.service.Restore(req.Resource, req.ID, branchID, role); err != nil {
		return utils.InternalErrorResponse(c, "Failed to restore deleted data")
	}

	return utils.SuccessResponse(c, "Deleted data restored successfully", fiber.Map{
		"resource": req.Resource,
		"id":       req.ID,
	})
}
