package admin

import (
	"github.com/gofiber/fiber/v2"

	"github.com/break/junhong_cmp_fiber/internal/model/dto"
	"github.com/break/junhong_cmp_fiber/internal/service/operation_password"
	"github.com/break/junhong_cmp_fiber/pkg/constants"
	"github.com/break/junhong_cmp_fiber/pkg/errors"
	"github.com/break/junhong_cmp_fiber/pkg/middleware"
	"github.com/break/junhong_cmp_fiber/pkg/response"
)

// SuperAdminHandler 超级管理员专属操作处理器
type SuperAdminHandler struct {
	operationPasswordService *operation_password.Service
}

// NewSuperAdminHandler 创建超级管理员处理器
func NewSuperAdminHandler(operationPasswordService *operation_password.Service) *SuperAdminHandler {
	return &SuperAdminHandler{
		operationPasswordService: operationPasswordService,
	}
}

// SetOperationPassword 设置/修改全局操作密码（仅超级管理员）
// POST /api/admin/super-admin/operation-password
func (h *SuperAdminHandler) SetOperationPassword(c *fiber.Ctx) error {
	userType := middleware.GetUserTypeFromContext(c.UserContext())
	if userType != constants.UserTypeSuperAdmin {
		return errors.New(errors.CodeForbidden, "无权限操作该资源或资源不存在")
	}

	var req dto.SetOperationPasswordRequest
	if err := c.BodyParser(&req); err != nil {
		return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
	}

	if req.Password == "" || req.ConfirmPassword == "" {
		return errors.New(errors.CodeInvalidParam)
	}

	if req.Password != req.ConfirmPassword {
		return errors.New(errors.CodeInvalidParam, "两次输入的密码不一致")
	}

	if len(req.Password) < 6 || len(req.Password) > 50 {
		return errors.New(errors.CodeInvalidParam, "密码长度必须在 6~50 位之间")
	}

	ctx := c.UserContext()
	if err := h.operationPasswordService.Set(ctx, req.Password); err != nil {
		return err
	}

	return response.Success(c, nil)
}

// GetOperationPasswordStatus 查询操作密码是否已设置（仅超级管理员）
// GET /api/admin/super-admin/operation-password/status
func (h *SuperAdminHandler) GetOperationPasswordStatus(c *fiber.Ctx) error {
	userType := middleware.GetUserTypeFromContext(c.UserContext())
	if userType != constants.UserTypeSuperAdmin {
		return errors.New(errors.CodeForbidden, "无权限操作该资源或资源不存在")
	}

	ctx := c.UserContext()
	isSet := h.operationPasswordService.IsSet(ctx)

	return response.Success(c, &dto.OperationPasswordStatusResponse{IsSet: isSet})
}
