# 🎯 Domínio - The Game

Pacote de domínio do jogo "The Game" contendo toda a lógica de negócio e regras do jogo.

## 📋 Sobre

Este pacote contém as entidades de domínio, regras de negócio e lógica central do jogo "The Game", seguindo os princípios de Domain-Driven Design (DDD). É uma biblioteca TypeScript independente que pode ser usada em qualquer projeto que precise implementar as regras deste jogo de cartas.

## 🚀 Tecnologias

- **TypeScript** - Tipagem estática
- **Jest** - Testes unitários
- **Domain-Driven Design** - Arquitetura de domínio
- **Clean Architecture** - Separação de responsabilidades

## 📁 Estrutura

```
src/
├── entities/              # Entidades de domínio
│   ├── Card.ts            # Entidade Carta
│   ├── Deck.ts            # Entidade Baralho
│   ├── Game.ts            # Entidade Jogo
│   ├── GameAction.ts      # Entidade Ação
│   ├── Pile.ts            # Entidade Pilha
│   └── Player.ts          # Entidade Jogador
├── repositories/          # Interfaces de repositório
├── utils/                 # Utilitários
└── value-objects/         # Objetos de valor
docs/                      # 📚 Documentação
```

## 🚀 Quick Start

### Pré-requisitos
- Node.js 18+
- npm ou yarn
- Git

### Instalação

1. **Clone o repositório**
   ```bash
   git clone https://github.com/rtsarakaki/the-game-domain.git
   cd the-game-domain
   ```

2. **Configure o .npmrc localmente**
   ```bash
   npm run setup:npmrc
   ```

3. **Instale as dependências**
   ```bash
   npm install
   ```

4. **Execute os testes**
   ```bash
   npm test
   ```

### Para Usuários
```bash
# Instalar o pacote
npm install the-game-domain

# Usar no seu código
import { Game } from 'the-game-domain'
const game = new Game(2) // 2 jogadores
```

### Para Desenvolvedores
```bash
# Instalar dependências
npm install

# Testes
npm test
npm test:watch

# Build
npm build

# Lint
npm lint
```

## 📋 Próximos Passos

1. **📖 Leia a [Documentação Completa](docs/)** para entender os conceitos
2. **🎮 Comece com a [Entidade Game](docs/Game.md)** - a principal do sistema
3. **🃏 Explore as [Entidades](docs/)** para entender cada componente
4. **📦 Configure [Publicação Local](docs/PUBLISH.md)** se quiser testar
   - ⚠️ **Importante:** Precisa rodar o Verdaccio primeiro (veja [🐳 Verdaccio Docker](docs/DOCKER.md))

## 📚 Documentação

### 🚀 Primeiros Passos
1. **[📖 Documentação Completa](docs/)** - Visão geral e conceitos
2. **[🐳 Verdaccio Docker](docs/DOCKER.md)** - Configuração do registry local (obrigatório para publicação)
3. **[📦 Publicação Local](docs/PUBLISH.md)** - Como instalar e publicar localmente

### 🎯 Entidades de Negócio
4. **[🎮 Jogo](docs/Game.md)** - Entidade principal (comece aqui!)
5. **[🃏 Cartas](docs/Card.md)** - Entidade Card (validação de valores 1-100)
6. **[🎴 Baralho](docs/Deck.md)** - Entidade Deck (gestão de cartas 2-99)
7. **[👤 Jogador](docs/Player.md)** - Entidade Player (gestão de mão e turnos)
8. **[📚 Pilha](docs/Pile.md)** - Entidade Pile (regras de descarte)

### ⚙️ Recursos Avançados
9. **[🗄️ Repository System](docs/Repository.md)** - Sistema de persistência in-memory
10. **[🚀 GitHub Actions](docs/GITHUB_ACTIONS.md)** - Publicação automática no npm público
11. **[🔢 Versionamento Automático](docs/VERSIONING.md)** - Semantic versioning automático
12. **[📦 NPM Registry Inteligente](docs/NPM_REGISTRY.md)** - Fallback automático entre Verdaccio e npm público



## 🎯 Entidades

### Core Entities
- **`Game`** - Estado do jogo e regras principais
- **`Player`** - Jogador e suas cartas
- **`Card`** - Carta individual
- **`Deck`** - Baralho de cartas
- **`Pile`** - Pilhas do jogo (crescente/decrescente)

### Supporting Entities
- **`GameAction`** - Histórico de ações do jogo

## 🎮 Regras do Jogo

### Objetivo
Descartar todas as cartas antes dos outros jogadores.

### Mecânicas
- Cada jogador recebe 6 cartas
- Cartas devem ser jogadas em ordem crescente ou decrescente
- Diferença de 10 é permitida entre cartas
- Jogador deve jogar pelo menos 1 carta por turno
- Vitória: descartar todas as cartas
- Derrota: não conseguir jogar cartas obrigatórias

## 🧪 Testes

O domínio possui cobertura completa de testes para garantir a integridade das regras de negócio:

```bash
# Executar todos os testes
npm test

# Testes em modo watch
npm test:watch

# Cobertura de testes
npm run test:coverage
```

## 📦 Uso

```typescript
import { Game, Player, Card } from 'the-game-domain'

// Criar um novo jogo
const game = new Game(['Jogador 1', 'Jogador 2'])

// Jogar uma carta
game.moveCardToPile(playerId, cardId, pileId)

// Verificar estado
console.log(game.isFinished)
console.log(game.currentPlayerId)
``` 