// internal/controllers/archive_controller.go
package controllers

import (
	"lost-and-found/internal/services"
	"lost-and-found/internal/utils"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

type ArchiveController struct {
	archiveService *services.ArchiveService
}

func NewArchiveController(db *gorm.DB) *ArchiveController {
	return &ArchiveController{
		archiveService: services.NewArchiveService(db),
	}
}

// GetAllArchives gets all archived items
// GET /api/archives
func (c *ArchiveController) GetAllArchives(ctx *gin.Context) {
	page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
	limit, _ := strconv.Atoi(ctx.DefaultQuery("limit", "10"))
	reason := ctx.Query("reason")
	search := ctx.Query("search")

	archives, total, err := c.archiveService.GetAllArchives(page, limit, reason, search)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, "Failed to get archives", err.Error())
		return
	}

	utils.SendPaginatedResponse(ctx, http.StatusOK, "Archives retrieved", archives, total, page, limit)
}

// GetArchiveByID gets archive by ID
// GET /api/archives/:id
func (c *ArchiveController) GetArchiveByID(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "Invalid archive ID", err.Error())
		return
	}

	archive, err := c.archiveService.GetArchiveByID(uint(id))
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusNotFound, "Archive not found", err.Error())
		return
	}

	utils.SuccessResponse(ctx, http.StatusOK, "Archive retrieved", archive.ToResponse())
}

// GetArchiveStats gets archive statistics
// GET /api/archives/stats
func (c *ArchiveController) GetArchiveStats(ctx *gin.Context) {
	stats, err := c.archiveService.GetArchiveStats()
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, "Failed to get stats", err.Error())
		return
	}

	utils.SuccessResponse(ctx, http.StatusOK, "Archive stats retrieved", stats)
}