// Package integration 定义 room-service 到外部服务的接口边界。
package integration

import (
	"context"

	"google.golang.org/grpc"
	luckygiftv1 "hyapp.local/api/proto/luckygift/v1"
	walletv1 "hyapp.local/api/proto/wallet/v1"
)

// grpcWalletClient 是 WalletClient 的 gRPC 实现。
type grpcWalletClient struct {
	// client 是 protobuf 生成的 wallet-service client。
	client walletv1.WalletServiceClient
}

// NewGRPCWalletClient 用 gRPC 连接创建 wallet-service 客户端。
func NewGRPCWalletClient(conn *grpc.ClientConn) WalletClient {
	return &grpcWalletClient{
		client: walletv1.NewWalletServiceClient(conn),
	}
}

// DebitGift 直接转调 wallet-service gRPC 接口。
func (c *grpcWalletClient) DebitGift(ctx context.Context, req *walletv1.DebitGiftRequest) (*walletv1.DebitGiftResponse, error) {
	// 这里不吞错，账务失败必须原样阻断 SendGift 房间状态变更。
	return c.client.DebitGift(ctx, req)
}

// BatchDebitGift 直接转调 wallet-service 批量送礼接口。
func (c *grpcWalletClient) BatchDebitGift(ctx context.Context, req *walletv1.BatchDebitGiftRequest) (*walletv1.BatchDebitGiftResponse, error) {
	// 多目标送礼必须由 wallet-service 单事务结算，room-service 不能自己循环单目标扣费。
	return c.client.BatchDebitGift(ctx, req)
}

// DebitRobotGift 直接转调 wallet-service 机器人专用金币扣费接口。
func (c *grpcWalletClient) DebitRobotGift(ctx context.Context, req *walletv1.DebitRobotGiftRequest) (*walletv1.DebitGiftResponse, error) {
	return c.client.DebitRobotGift(ctx, req)
}

// GrantResourceGroup 直接转调 wallet-service 资源组发放接口。
func (c *grpcWalletClient) GrantResourceGroup(ctx context.Context, req *walletv1.GrantResourceGroupRequest) (*walletv1.ResourceGrantResponse, error) {
	// 火箭奖励以 resource group 为后台配置单位，wallet-service 负责展开资产和权益。
	return c.client.GrantResourceGroup(ctx, req)
}

// GetMyVip 直接读取钱包已经求值后的 VIP 状态；房间侧不能复制付费 VIP、体验卡和权益继承算法。
func (c *grpcWalletClient) GetMyVip(ctx context.Context, req *walletv1.GetMyVipRequest) (*walletv1.GetMyVipResponse, error) {
	return c.client.GetMyVip(ctx, req)
}

// CheckVipBenefit 使用 wallet 已求值的最终权益；room-service 不按 VIP 等级反推。
func (c *grpcWalletClient) CheckVipBenefit(ctx context.Context, req *walletv1.CheckVipBenefitRequest) (*walletv1.CheckVipBenefitResponse, error) {
	return c.client.CheckVipBenefit(ctx, req)
}

// ListUserResources 返回 wallet 判定仍有效的 entitlement 和资源目录快照。
func (c *grpcWalletClient) ListUserResources(ctx context.Context, req *walletv1.ListUserResourcesRequest) (*walletv1.ListUserResourcesResponse, error) {
	return c.client.ListUserResources(ctx, req)
}

type grpcLuckyGiftClient struct {
	client luckygiftv1.LuckyGiftServiceClient
}

// NewGRPCLuckyGiftClient 用 gRPC 连接创建 lucky-gift-service 幸运礼物客户端。
func NewGRPCLuckyGiftClient(conn *grpc.ClientConn) LuckyGiftClient {
	return &grpcLuckyGiftClient{client: luckygiftv1.NewLuckyGiftServiceClient(conn)}
}

func (c *grpcLuckyGiftClient) CheckLuckyGift(ctx context.Context, req *luckygiftv1.CheckLuckyGiftRequest) (*luckygiftv1.CheckLuckyGiftResponse, error) {
	return c.client.CheckLuckyGift(ctx, req)
}

func (c *grpcLuckyGiftClient) ExecuteLuckyGiftDraw(ctx context.Context, req *luckygiftv1.ExecuteLuckyGiftDrawRequest) (*luckygiftv1.ExecuteLuckyGiftDrawResponse, error) {
	return c.client.ExecuteLuckyGiftDraw(ctx, req)
}

func (c *grpcLuckyGiftClient) BatchExecuteLuckyGiftDraw(ctx context.Context, req *luckygiftv1.BatchExecuteLuckyGiftDrawRequest) (*luckygiftv1.BatchExecuteLuckyGiftDrawResponse, error) {
	return c.client.BatchExecuteLuckyGiftDraw(ctx, req)
}
