package card

import (
	"context"

	"go-common/app/interface/main/account/conf"
	v1 "go-common/app/service/main/card/api/grpc/v1"
)

// Service .
type Service struct {
	// conf
	c *conf.Config
	// card service
	cardRPC v1.CardClient
}

// New create service instance and return.
func New(c *conf.Config) (s *Service) {
	s = &Service{
		c: c,
	}
	cardRPC, err := v1.NewClient(c.CardClient)
	if err != nil {
		panic(err)
	}
	s.cardRPC = cardRPC
	return
}

// UserCard user card info.
func (s *Service) UserCard(c context.Context, mid int64) (res *v1.ModelUserCard, err error) {
	var reply *v1.UserCardReply
	if reply, err = s.cardRPC.UserCard(c, &v1.UserCardReq{Mid: mid}); err != nil {
		return
	}
	res = reply.Res
	return
}

// Card get card info by id.
func (s *Service) Card(c context.Context, id int64) (res *v1.ModelCard, err error) {
	var reply *v1.CardReply
	if reply, err = s.cardRPC.Card(c, &v1.CardReq{Id: id}); err != nil {
		return
	}
	res = reply.Data_0
	return
}

// CardHots get all hots cards.
func (s *Service) CardHots(c context.Context) (res []*v1.ModelCard, err error) {
	var reply *v1.CardHotsReply
	if reply, err = s.cardRPC.CardHots(c, &v1.CardHotsReq{}); err != nil {
		return
	}
	res = reply.Data_0
	return
}

// AllGroup all group.
func (s *Service) AllGroup(c context.Context, mid int64) (res *v1.ModelAllGroupResp, err error) {
	var reply *v1.AllGroupReply
	if reply, err = s.cardRPC.AllGroup(c, &v1.AllGroupReq{Mid: mid}); err != nil {
		return
	}
	res = reply.Res
	return
}

// CardsByGid get cards by gid.
func (s *Service) CardsByGid(c context.Context, id int64) (res []*v1.ModelCard, err error) {
	var reply *v1.CardsByGidReply
	if reply, err = s.cardRPC.CardsByGid(c, &v1.CardsByGidReq{Gid: id}); err != nil {
		return
	}
	res = reply.Data_0
	return
}

// Equip card equip.
func (s *Service) Equip(c context.Context, arg *v1.ModelArgEquip) (err error) {
	_, err = s.cardRPC.Equip(c, &v1.EquipReq{Arg: arg})
	return
}

// Demount card demount.
func (s *Service) Demount(c context.Context, mid int64) (err error) {
	_, err = s.cardRPC.DemountEquip(c, &v1.DemountEquipReq{Mid: mid})
	return
}