package admin

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

	"github.com/break/junhong_cmp_fiber/internal/model/dto"
	iotCardService "github.com/break/junhong_cmp_fiber/internal/service/iot_card"
	"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"
)

type IotCardHandler struct {
	service *iotCardService.Service
}

func NewIotCardHandler(service *iotCardService.Service) *IotCardHandler {
	return &IotCardHandler{
		service: service,
	}
}

func (h *IotCardHandler) ListStandalone(c *fiber.Ctx) error {
	var req dto.ListStandaloneIotCardRequest
	if err := c.QueryParser(&req); err != nil {
		return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
	}

	result, err := h.service.ListStandalone(c.UserContext(), &req)
	if err != nil {
		return err
	}

	return response.SuccessWithPagination(c, result.List, result.Total, result.Page, result.PageSize)
}

// BatchUpdateRealnamePolicy 批量更新卡实名认证策略。
// POST /api/admin/iot-cards/batch-update-realname-policy
func (h *IotCardHandler) BatchUpdateRealnamePolicy(c *fiber.Ctx) error {
	var req dto.BatchUpdateAssetRealnamePolicyRequest
	if err := c.BodyParser(&req); err != nil {
		return errors.New(errors.CodeInvalidParam)
	}
	result, err := h.service.BatchUpdateRealnamePolicy(c.UserContext(), &req)
	if err != nil {
		return err
	}
	return response.Success(c, result)
}

// SetSpeedTier 设置或恢复 IoT 卡固定限速档位。
// PUT /api/admin/iot-cards/:iccid/speed-tier
func (h *IotCardHandler) SetSpeedTier(c *fiber.Ctx) error {
	iccid := c.Params("iccid")
	if iccid == "" {
		return errors.New(errors.CodeInvalidParam, "ICCID 不能为空")
	}
	var req dto.SetIotCardSpeedTierRequest
	if err := c.BodyParser(&req); err != nil {
		return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
	}
	result, err := h.service.SetSpeedTier(c.UserContext(), iccid, req.Code)
	if err != nil {
		return err
	}
	return response.Success(c, result)
}

func (h *IotCardHandler) AllocateCards(c *fiber.Ctx) error {
	var req dto.AllocateStandaloneCardsRequest
	if err := c.BodyParser(&req); err != nil {
		return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
	}

	ctx := c.UserContext()
	operatorID := middleware.GetUserIDFromContext(ctx)
	userType := middleware.GetUserTypeFromContext(ctx)

	var operatorShopID *uint
	if userType == constants.UserTypeAgent {
		shopID := middleware.GetShopIDFromContext(ctx)
		if shopID > 0 {
			operatorShopID = &shopID
		}
	}

	result, err := h.service.AllocateCards(ctx, &req, operatorID, operatorShopID)
	if err != nil {
		return err
	}

	return response.Success(c, result)
}

func (h *IotCardHandler) RecallCards(c *fiber.Ctx) error {
	var req dto.RecallStandaloneCardsRequest
	if err := c.BodyParser(&req); err != nil {
		return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
	}

	ctx := c.UserContext()
	operatorID := middleware.GetUserIDFromContext(ctx)
	userType := middleware.GetUserTypeFromContext(ctx)

	var operatorShopID *uint
	if userType == constants.UserTypeAgent {
		shopID := middleware.GetShopIDFromContext(ctx)
		if shopID > 0 {
			operatorShopID = &shopID
		}
	}

	result, err := h.service.RecallCards(ctx, &req, operatorID, operatorShopID)
	if err != nil {
		return err
	}

	return response.Success(c, result)
}

func (h *IotCardHandler) BatchSetSeriesBinding(c *fiber.Ctx) error {
	var req dto.BatchSetCardSeriesBindngRequest
	if err := c.BodyParser(&req); err != nil {
		return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
	}

	ctx := c.UserContext()
	userType := middleware.GetUserTypeFromContext(ctx)

	var operatorShopID *uint
	if userType == constants.UserTypeAgent {
		shopID := middleware.GetShopIDFromContext(ctx)
		if shopID > 0 {
			operatorShopID = &shopID
		}
	}

	result, err := h.service.BatchSetSeriesBinding(ctx, &req, operatorShopID)
	if err != nil {
		return err
	}

	return response.Success(c, result)
}

// GetRealnameLink 获取实名认证链接
func (h *IotCardHandler) GetRealnameLink(c *fiber.Ctx) error {
	iccid := c.Params("iccid")
	if iccid == "" {
		return errors.New(errors.CodeInvalidParam, "ICCID不能为空")
	}

	link, err := h.service.GatewayGetRealnameLink(c.UserContext(), iccid)
	if err != nil {
		return err
	}

	return response.Success(c, link)
}
