package admin

import (
	"strconv"

	"github.com/gofiber/fiber/v2"

	"github.com/break/junhong_cmp_fiber/internal/model/dto"
	pollingService "github.com/break/junhong_cmp_fiber/internal/service/polling"
	"github.com/break/junhong_cmp_fiber/pkg/errors"
	"github.com/break/junhong_cmp_fiber/pkg/response"
)

// PollingConfigHandler 轮询配置 Handler
type PollingConfigHandler struct {
	service *pollingService.ConfigService
}

// NewPollingConfigHandler 创建轮询配置 Handler 实例
func NewPollingConfigHandler(service *pollingService.ConfigService) *PollingConfigHandler {
	return &PollingConfigHandler{service: service}
}

// List 获取轮询配置列表
// @Summary 获取轮询配置列表
// @Description 获取轮询配置列表，支持分页和筛选
// @Tags 轮询配置管理
// @Accept json
// @Produce json
// @Param page query int false "页码"
// @Param page_size query int false "每页数量"
// @Param status query int false "状态 (1:启用, 0:禁用)"
// @Param card_condition query string false "卡状态条件"
// @Param card_category query string false "卡业务类型"
// @Param carrier_id query int false "运营商ID"
// @Param config_name query string false "配置名称"
// @Success 200 {object} response.Response{data=dto.PollingConfigPageResult}
// @Router /api/admin/polling-configs [get]
func (h *PollingConfigHandler) List(c *fiber.Ctx) error {
	var req dto.PollingConfigListRequest
	if err := c.QueryParser(&req); err != nil {
		return errors.New(errors.CodeInvalidParam)
	}

	configs, total, err := h.service.List(c.UserContext(), &req)
	if err != nil {
		return err
	}

	return response.SuccessWithPagination(c, configs, total, req.Page, req.PageSize)
}

// Create 创建轮询配置
// @Summary 创建轮询配置
// @Description 创建新的轮询配置
// @Tags 轮询配置管理
// @Accept json
// @Produce json
// @Param body body dto.CreatePollingConfigRequest true "创建轮询配置请求"
// @Success 200 {object} response.Response{data=dto.PollingConfigResponse}
// @Router /api/admin/polling-configs [post]
func (h *PollingConfigHandler) Create(c *fiber.Ctx) error {
	var req dto.CreatePollingConfigRequest
	if err := c.BodyParser(&req); err != nil {
		return errors.New(errors.CodeInvalidParam)
	}

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

	return response.Success(c, config)
}

// Get 获取轮询配置详情
// @Summary 获取轮询配置详情
// @Description 根据 ID 获取轮询配置详情
// @Tags 轮询配置管理
// @Accept json
// @Produce json
// @Param id path int true "配置ID"
// @Success 200 {object} response.Response{data=dto.PollingConfigResponse}
// @Router /api/admin/polling-configs/{id} [get]
func (h *PollingConfigHandler) Get(c *fiber.Ctx) error {
	id, err := strconv.ParseUint(c.Params("id"), 10, 64)
	if err != nil {
		return errors.New(errors.CodeInvalidParam, "无效的配置 ID")
	}

	config, err := h.service.Get(c.UserContext(), uint(id))
	if err != nil {
		return err
	}

	return response.Success(c, config)
}

// Update 更新轮询配置
// @Summary 更新轮询配置
// @Description 根据 ID 更新轮询配置
// @Tags 轮询配置管理
// @Accept json
// @Produce json
// @Param id path int true "配置ID"
// @Param body body dto.UpdatePollingConfigRequest true "更新轮询配置请求"
// @Success 200 {object} response.Response{data=dto.PollingConfigResponse}
// @Router /api/admin/polling-configs/{id} [put]
func (h *PollingConfigHandler) Update(c *fiber.Ctx) error {
	id, err := strconv.ParseUint(c.Params("id"), 10, 64)
	if err != nil {
		return errors.New(errors.CodeInvalidParam, "无效的配置 ID")
	}

	var req dto.UpdatePollingConfigRequest
	if err := c.BodyParser(&req); err != nil {
		return errors.New(errors.CodeInvalidParam)
	}

	config, err := h.service.Update(c.UserContext(), uint(id), &req)
	if err != nil {
		return err
	}

	return response.Success(c, config)
}

// Delete 删除轮询配置
// @Summary 删除轮询配置
// @Description 根据 ID 删除轮询配置
// @Tags 轮询配置管理
// @Accept json
// @Produce json
// @Param id path int true "配置ID"
// @Success 200 {object} response.Response
// @Router /api/admin/polling-configs/{id} [delete]
func (h *PollingConfigHandler) Delete(c *fiber.Ctx) error {
	id, err := strconv.ParseUint(c.Params("id"), 10, 64)
	if err != nil {
		return errors.New(errors.CodeInvalidParam, "无效的配置 ID")
	}

	if err := h.service.Delete(c.UserContext(), uint(id)); err != nil {
		return err
	}

	return response.Success(c, nil)
}

// UpdateStatus 更新轮询配置状态
// @Summary 更新轮询配置状态
// @Description 启用或禁用轮询配置
// @Tags 轮询配置管理
// @Accept json
// @Produce json
// @Param id path int true "配置ID"
// @Param body body dto.UpdatePollingConfigStatusRequest true "更新状态请求"
// @Success 200 {object} response.Response
// @Router /api/admin/polling-configs/{id}/status [put]
func (h *PollingConfigHandler) UpdateStatus(c *fiber.Ctx) error {
	id, err := strconv.ParseUint(c.Params("id"), 10, 64)
	if err != nil {
		return errors.New(errors.CodeInvalidParam, "无效的配置 ID")
	}

	var req dto.UpdatePollingConfigStatusRequest
	if err := c.BodyParser(&req); err != nil {
		return errors.New(errors.CodeInvalidParam)
	}

	if err := h.service.UpdateStatus(c.UserContext(), uint(id), req.Status); err != nil {
		return err
	}

	return response.Success(c, nil)
}

// ListEnabled 获取所有启用的配置
// @Summary 获取所有启用的配置
// @Description 获取所有启用状态的轮询配置，按优先级排序
// @Tags 轮询配置管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=[]dto.PollingConfigResponse}
// @Router /api/admin/polling-configs/enabled [get]
func (h *PollingConfigHandler) ListEnabled(c *fiber.Ctx) error {
	configs, err := h.service.ListEnabled(c.UserContext())
	if err != nil {
		return err
	}

	return response.Success(c, configs)
}
