package service

import (
	"errors"
	"strings"
	
	"github.com/gin-gonic/gin"

	"tower_api/pkg/errcode"
	"tower_api/pkg/util"
)

type H5Param interface {
	Validate() error      //校验
	GetChannelId() string //获取channel_id
	GenDataMap() gin.H    //生成sign
}

// H5ParamBase h5参数的公共部分
type H5ParamBase struct {
	ChannelId string `json:"channel_id"`
	UserToken string `json:"userToken"`
}

func (h *H5ParamBase) validateBase() error {
	h.ChannelId = strings.TrimSpace(h.ChannelId)
	h.UserToken = strings.TrimSpace(h.UserToken)
	if util.IsNormalStr(h.ChannelId) == false || util.IsNormalStr(h.UserToken) == false {
		return errors.New(errcode.GetMsg(errcode.InvalidParams))
	}
	return nil
}

// H5Init 初始化
type H5Init struct {
	H5ParamBase
}

func (h *H5Init) Validate() error {
	h.ChannelId = strings.TrimSpace(h.ChannelId)
	if util.IsNormalStr(h.ChannelId) == false {
		return errors.New(errcode.GetMsg(errcode.InvalidParams))
	}
	return nil
}
func (h *H5Init) GetChannelId() string {
	return h.ChannelId
}

func (h *H5Init) GenDataMap() gin.H {
	data := gin.H{
		"channel_id": h.ChannelId,
	}
	return data
}

// H5UserInfo 获取用户信息用于登录
type H5UserInfo struct {
	H5ParamBase
}

func (h *H5UserInfo) Validate() error {
	return h.validateBase()
}
func (h *H5UserInfo) GetChannelId() string {
	return h.ChannelId
}
func (h *H5UserInfo) GenDataMap() gin.H {
	data := gin.H{
		"channel_id": h.ChannelId,
		"userToken":  h.UserToken,
	}
	return data
}

// H5Charge 充值部分
type H5Charge struct {
	H5ParamBase
	OrderId string `json:"orderid"` //订单号
	Price   string `json:"price"`   //订单金额(元)
	ItemId  string `json:"item_id"` //类目信息
	Other   string `json:"other"`   //额外参数
}

func (h *H5Charge) Validate() error {
	err := h.validateBase()
	if err != nil {
		return err
	}
	h.OrderId = strings.TrimSpace(h.OrderId)
	h.ItemId = strings.TrimSpace(h.ItemId)
	h.Other = strings.TrimSpace(h.Other)
	if h.OrderId == "" {
		return errors.New("empty orderid")
	}
	if h.Price == "" {
		return errors.New("empty price")
	}
	return nil
}

func (h *H5Charge) GetChannelId() string {
	return h.ChannelId
}

func (h *H5Charge) GenDataMap() gin.H {
	data := gin.H{
		"channel_id": h.ChannelId,
		"userToken":  h.UserToken,
		"orderid":    h.OrderId,
		"price":      h.Price,
		"item_id":    h.ItemId,
		"other":      h.Other,
	}
	return data
}

type H5Service struct {
}

func NewH5Service() *H5Service {
	return &H5Service{}
}

// GetReqParam 获取请求参数
func (s *H5Service) GetReqParam(flag string) (H5Param, error) {
	switch flag {
	case "init":
		return new(H5Init), nil
	case "userInfo":
		return new(H5UserInfo), nil
	case "charge":
		return new(H5Charge), nil
	default:
		return nil, errors.New(errcode.GetMsg(errcode.InvalidParams))
	}
}
