package main

import "fmt"

// Suit — масть карты.
type Suit int

const (
	Clubs    Suit = iota // трефы
	Diamonds             // бубны
	Hearts               // червы
	Spades               // пики
)

func (s Suit) String() string {
	switch s {
	case Clubs:
		return "♣"
	case Diamonds:
		return "♦"
	case Hearts:
		return "♥"
	case Spades:
		return "♠"
	default:
		return "?"
	}
}

// Rank — ранг карты. Туз = 1, валет/дама/король = 11/12/13.
type Rank int

const (
	Ace Rank = iota + 1
	Two
	Three
	Four
	Five
	Six
	Seven
	Eight
	Nine
	Ten
	Jack
	Queen
	King
)

func (r Rank) String() string {
	switch r {
	case Ace:
		return "A"
	case Jack:
		return "J"
	case Queen:
		return "Q"
	case King:
		return "K"
	default:
		return fmt.Sprintf("%d", int(r))
	}
}

// Value возвращает очковую стоимость карты для подсчёта веса руки
// и штрафов: туз = 1, картинки = 10, остальные — номинал.
func (r Rank) Value() int {
	switch {
	case r == Ace:
		return 1
	case r >= Jack: // J, Q, K
		return 10
	default:
		return int(r)
	}
}

// Card — игральная карта.
type Card struct {
	Suit Suit
	Rank Rank
}

func (c Card) String() string {
	return fmt.Sprintf("%s%s", c.Rank, c.Suit)
}

// Value — очковая стоимость карты (см. Rank.Value).
func (c Card) Value() int {
	return c.Rank.Value()
}
