package algorithm

func (c *Cards) Counter() *ValueCounter {
	var counter ValueCounter
	counter.Set(*c)
	return &counter
}
func (c *Cards) GetType() uint32 {
	numCards := len(*c)
	if numCards == 0 {
		return 0
	}

	cards := *c
	counter := c.Counter()
	ASort(cards, 0, int8(numCards)-1, counter)

	checks := []func() uint32{
		c.royalFlush,
		c.straightFlush,
		func() uint32 { return c.four(counter) },
		func() uint32 { return c.fullFouse(counter) },
		c.flush,
		c.straight,
		func() uint32 { return c.three(counter) },
		c.twoPair,
		c.onePair,
	}

	for _, check := range checks {
		if res := check(); res != 0 {
			return res
		}
	}

	// 高牌（High Card）：如果不符合任何组合，则返回最高牌
	//高牌（high card）
	//既不是同一花色也不是同一点数的五张牌组成。
	//平手牌：如果不止一人抓到此牌，则比较点数最大者，
	//如果点数最大的相同，则比较第二、第三、第四和第五大的，如果所有牌都相同，则平分彩池。
	return En(HIGH_CARD, ToValue(cards))
}
