package handlers

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

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

// GET /api/public/app-downloads
func ListAppDownloadsPublicHandler(db *gorm.DB) fiber.Handler {
	return func(c *fiber.Ctx) error {
		var apps []models.AppDownload
		if err := db.Order("created_at desc").Find(&apps).Error; err != nil {
			return c.Status(500).JSON(fiber.Map{"error": "Không thể tải danh sách ứng dụng"})
		}
		return c.JSON(fiber.Map{"data": apps})
	}
}

// GET /api/app-downloads
func ListAppDownloadsHandler(db *gorm.DB) fiber.Handler {
	return func(c *fiber.Ctx) error {
		var apps []models.AppDownload
		if err := db.Order("created_at desc").Find(&apps).Error; err != nil {
			return c.Status(500).JSON(fiber.Map{"error": "Không thể tải danh sách ứng dụng"})
		}
		return c.JSON(fiber.Map{"data": apps})
	}
}

// POST /api/app-downloads
func CreateAppDownloadHandler(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 {
			Name        string `json:"name"`
			Description string `json:"description"`
			DownloadURL string `json:"downloadUrl"`
			Platform    string `json:"platform"`
		}
		var req Request
		if err := c.BodyParser(&req); err != nil {
			return c.Status(400).JSON(fiber.Map{"error": "Invalid request body"})
		}
		if req.Name == "" || req.DownloadURL == "" {
			return c.Status(400).JSON(fiber.Map{"error": "Tên ứng dụng và đường dẫn tải không được để trống"})
		}

		app := models.AppDownload{
			Name:        req.Name,
			Description: req.Description,
			DownloadURL: req.DownloadURL,
			Platform:    req.Platform,
		}
		if err := db.Create(&app).Error; err != nil {
			return c.Status(500).JSON(fiber.Map{"error": "Lưu ứng dụng thất bại"})
		}

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

// PUT /api/app-downloads/:id
func UpdateAppDownloadHandler(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 app models.AppDownload
		if err := db.First(&app, uint(id)).Error; err != nil {
			return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy ứng dụng"})
		}

		type Request struct {
			Name        string `json:"name"`
			Description string `json:"description"`
			DownloadURL string `json:"downloadUrl"`
			Platform    string `json:"platform"`
		}
		var req Request
		if err := c.BodyParser(&req); err != nil {
			return c.Status(400).JSON(fiber.Map{"error": "Invalid request body"})
		}
		if req.Name == "" || req.DownloadURL == "" {
			return c.Status(400).JSON(fiber.Map{"error": "Tên ứng dụng và đường dẫn tải không được để trống"})
		}

		app.Name = req.Name
		app.Description = req.Description
		app.DownloadURL = req.DownloadURL
		app.Platform = req.Platform

		if err := db.Save(&app).Error; err != nil {
			return c.Status(500).JSON(fiber.Map{"error": "Cập nhật ứng dụng thất bại"})
		}

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

// DELETE /api/app-downloads/:id
func DeleteAppDownloadHandler(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 app models.AppDownload
		if err := db.First(&app, uint(id)).Error; err != nil {
			return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy ứng dụng"})
		}

		if err := db.Delete(&app).Error; err != nil {
			return c.Status(500).JSON(fiber.Map{"error": "Xóa ứng dụng thất bại"})
		}

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

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