package app

import (
	"bindbox-game/internal/repository/mysql/model"
	"testing"
)

// TestSelectRewardExact 测试对对碰选奖逻辑：精确匹配 TotalPairs == MinScore
func TestSelectRewardExact(t *testing.T) {
	// 模拟奖品设置 (使用 Level 作为标识，因为 ActivityRewardSettings 没有 Name 字段)
	rewards := []*model.ActivityRewardSettings{
		{ID: 1, Level: 1, MinScore: 10, Quantity: 5},
		{ID: 2, Level: 2, MinScore: 20, Quantity: 5},
		{ID: 3, Level: 3, MinScore: 30, Quantity: 5},
		{ID: 4, Level: 4, MinScore: 40, Quantity: 5},
		{ID: 5, Level: 5, MinScore: 45, Quantity: 5},
	}

	testCases := []struct {
		name         string
		totalPairs   int64
		expectReward *int64 // nil = 无匹配
		expectLevel  int32
	}{
		{"精确匹配10对", 10, ptr(int64(1)), 1},
		{"精确匹配20对", 20, ptr(int64(2)), 2},
		{"精确匹配30对", 30, ptr(int64(3)), 3},
		{"精确匹配40对", 40, ptr(int64(4)), 4},
		{"精确匹配45对", 45, ptr(int64(5)), 5},
		{"15对-无匹配", 15, nil, 0},
		{"25对-无匹配", 25, nil, 0},
		{"35对-无匹配", 35, nil, 0},
		{"50对-无匹配", 50, nil, 0},
		{"0对-无匹配", 0, nil, 0},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			candidate := selectRewardExact(rewards, tc.totalPairs)

			if tc.expectReward == nil {
				if candidate != nil {
					t.Errorf("期望无匹配，但得到奖品: Level=%d (ID=%d)", candidate.Level, candidate.ID)
				}
			} else {
				if candidate == nil {
					t.Errorf("期望匹配奖品ID=%d，但无匹配", *tc.expectReward)
				} else if candidate.ID != *tc.expectReward {
					t.Errorf("期望奖品ID=%d，实际=%d", *tc.expectReward, candidate.ID)
				} else if candidate.Level != tc.expectLevel {
					t.Errorf("期望奖品Level=%d，实际=%d", tc.expectLevel, candidate.Level)
				}
			}
		})
	}
}

// TestSelectRewardWithZeroQuantity 测试库存为0时不匹配
func TestSelectRewardWithZeroQuantity(t *testing.T) {
	rewards := []*model.ActivityRewardSettings{
		{ID: 1, Level: 1, MinScore: 10, Quantity: 0}, // 库存为0
		{ID: 2, Level: 2, MinScore: 20, Quantity: 5},
	}

	// 即使精确匹配，库存为0也不应匹配
	candidate := selectRewardExact(rewards, 10)
	if candidate != nil {
		t.Errorf("库存为0时不应匹配，但得到: Level=%d", candidate.Level)
	}

	// 库存>0应正常匹配
	candidate = selectRewardExact(rewards, 20)
	if candidate == nil {
		t.Error("库存>0时应匹配，但无匹配")
	} else if candidate.ID != 2 {
		t.Errorf("期望ID=2，实际=%d", candidate.ID)
	}
}

// selectRewardExact 精确匹配选奖逻辑（从matching_game_app.go提取）
// 这是 CheckMatchingGame 中实际使用的逻辑
func selectRewardExact(rewards []*model.ActivityRewardSettings, totalPairs int64) *model.ActivityRewardSettings {
	for _, r := range rewards {
		if r.Quantity <= 0 {
			continue
		}
		// 精确匹配：用户消除的对子数 == 奖品设置的 MinScore
		if totalPairs == r.MinScore {
			return r
		}
	}
	return nil
}

// ptr 辅助函数：创建int64指针
func ptr(v int64) *int64 {
	return &v
}
