package handlers

import (
	"strconv"
	"server/internal/models"

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

// GET /api/public/app-guides
func ListAppGuidesPublicHandler(db *gorm.DB) fiber.Handler {
	return func(c *fiber.Ctx) error {
		var guides []models.AppGuide
		if err := db.Order("created_at desc").Find(&guides).Error; err != nil {
			return c.Status(500).JSON(fiber.Map{"error": "Không thể tải danh sách tài liệu hướng dẫn"})
		}
		return c.JSON(fiber.Map{"data": guides})
	}
}

// GET /api/app-guides
func ListAppGuidesHandler(db *gorm.DB) fiber.Handler {
	return func(c *fiber.Ctx) error {
		var guides []models.AppGuide
		if err := db.Order("created_at desc").Find(&guides).Error; err != nil {
			return c.Status(500).JSON(fiber.Map{"error": "Không thể tải danh sách tài liệu hướng dẫn"})
		}
		return c.JSON(fiber.Map{"data": guides})
	}
}

// POST /api/app-guides
func CreateAppGuideHandler(db *gorm.DB) fiber.Handler {
	return func(c *fiber.Ctx) error {
		if !isSuperAdmin(c) {
			return c.Status(403).JSON(fiber.Map{"error": "Bạn không có quyền thực hiện chức năng này"})
		}

		type Request struct {
			Title string `json:"title"`
			URL   string `json:"url"`
		}
		var req Request
		if err := c.BodyParser(&req); err != nil {
			return c.Status(400).JSON(fiber.Map{"error": "Invalid request body"})
		}
		if req.Title == "" || req.URL == "" {
			return c.Status(400).JSON(fiber.Map{"error": "Tiêu đề và đường dẫn không được để trống"})
		}

		guide := models.AppGuide{
			Title: req.Title,
			URL:   req.URL,
		}
		if err := db.Create(&guide).Error; err != nil {
			return c.Status(500).JSON(fiber.Map{"error": "Lưu tài liệu hướng dẫn thất bại"})
		}

		return c.JSON(fiber.Map{"ok": true, "data": guide})
	}
}

// PUT /api/app-guides/:id
func UpdateAppGuideHandler(db *gorm.DB) fiber.Handler {
	return func(c *fiber.Ctx) error {
		if !isSuperAdmin(c) {
			return c.Status(403).JSON(fiber.Map{"error": "Bạn không có quyền thực hiện chức năng này"})
		}

		idParam := c.Params("id")
		id, err := strconv.ParseUint(idParam, 10, 32)
		if err != nil {
			return c.Status(400).JSON(fiber.Map{"error": "Invalid ID"})
		}

		var guide models.AppGuide
		if err := db.First(&guide, uint(id)).Error; err != nil {
			return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy tài liệu hướng dẫn"})
		}

		type Request struct {
			Title string `json:"title"`
			URL   string `json:"url"`
		}
		var req Request
		if err := c.BodyParser(&req); err != nil {
			return c.Status(400).JSON(fiber.Map{"error": "Invalid request body"})
		}
		if req.Title == "" || req.URL == "" {
			return c.Status(400).JSON(fiber.Map{"error": "Tiêu đề và đường dẫn không được để trống"})
		}

		guide.Title = req.Title
		guide.URL = req.URL

		if err := db.Save(&guide).Error; err != nil {
			return c.Status(500).JSON(fiber.Map{"error": "Cập nhật tài liệu hướng dẫn thất bại"})
		}

		return c.JSON(fiber.Map{"ok": true, "data": guide})
	}
}

// DELETE /api/app-guides/:id
func DeleteAppGuideHandler(db *gorm.DB) fiber.Handler {
	return func(c *fiber.Ctx) error {
		if !isSuperAdmin(c) {
			return c.Status(403).JSON(fiber.Map{"error": "Bạn không có quyền thực hiện chức năng này"})
		}

		idParam := c.Params("id")
		id, err := strconv.ParseUint(idParam, 10, 32)
		if err != nil {
			return c.Status(400).JSON(fiber.Map{"error": "Invalid ID"})
		}

		var guide models.AppGuide
		if err := db.First(&guide, uint(id)).Error; err != nil {
			return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy tài liệu hướng dẫn"})
		}

		if err := db.Delete(&guide).Error; err != nil {
			return c.Status(500).JSON(fiber.Map{"error": "Xóa tài liệu hướng dẫn thất bại"})
		}

		return c.JSON(fiber.Map{"ok": true})
	}
}
