package agent

import (
	"context"
	"sim-server/app/main/model"
	"sim-server/common/ctxdata"
	"sim-server/common/xerr"

	"github.com/pkg/errors"

	"sim-server/app/main/api/internal/svc"
	"sim-server/app/main/api/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type GetAgentProductConfigLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewGetAgentProductConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentProductConfigLogic {
	return &GetAgentProductConfigLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *GetAgentProductConfigLogic) GetAgentProductConfig() (resp *types.AgentProductConfigResp, err error) {
	userID, err := ctxdata.GetUidFromCtx(l.ctx)
	if err != nil {
		return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户信息失败, %v", err)
	}

	// 1. 验证用户是否为代理
	_, err = l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID)
	if err != nil {
		if errors.Is(err, model.ErrNotFound) {
			return nil, errors.Wrapf(xerr.NewErrMsg("您不是代理"), "")
		}
		return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败, %v", err)
	}

	// 系统简化：移除等级加成，直接使用基础配置
	// 2. 查询所有产品配置
	builder := l.svcCtx.AgentProductConfigModel.SelectBuilder()
	productConfigs, err := l.svcCtx.AgentProductConfigModel.FindAll(l.ctx, builder, "")
	if err != nil {
		return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询产品配置失败, %v", err)
	}

	// 3. 组装响应数据（通过 product_id 查询产品名称和英文标识）
	var respList []types.ProductConfigItem
	for _, productConfig := range productConfigs {
		// 通过 product_id 查询产品信息获取产品名称和英文标识
		product, err := l.svcCtx.ProductModel.FindOne(l.ctx, productConfig.ProductId)
		productName := ""
		productEn := ""
		if err == nil {
			productName = product.ProductName
			productEn = product.ProductEn
		} else {
			// 如果产品不存在，记录日志但不影响主流程
			l.Infof("查询产品信息失败, productId: %d, err: %v", productConfig.ProductId, err)
		}

		// 系统简化：直接使用基础底价和系统最高价
		actualBasePrice := productConfig.BasePrice
		priceRangeMin := actualBasePrice
		priceRangeMax := productConfig.SystemMaxPrice

		// 使用产品配置的提价阈值和手续费比例，如果为NULL则使用0
		productPriceThreshold := 0.0
		if productConfig.PriceThreshold.Valid {
			productPriceThreshold = productConfig.PriceThreshold.Float64
		}
		productPriceFeeRate := 0.0
		if productConfig.PriceFeeRate.Valid {
			productPriceFeeRate = productConfig.PriceFeeRate.Float64
		}

		respList = append(respList, types.ProductConfigItem{
			ProductId:       productConfig.ProductId,
			ProductName:     productName,
			ProductEn:       productEn,
			ActualBasePrice: actualBasePrice,
			PriceRangeMin:   priceRangeMin,
			PriceRangeMax:   priceRangeMax,
			PriceThreshold:  productPriceThreshold,
			PriceFeeRate:    productPriceFeeRate,
		})
	}

	return &types.AgentProductConfigResp{
		List: respList,
	}, nil
}
