# Spor Toto Modülü — Changelog

**Tarih:** 25 Mart 2026  
**Konu:** Süper Toto (parimutuel bahis) modülünün sıfırdan oluşturulması

---

## 1. Genel Bakış

Süper Toto, İddaa'dan farklı olarak **parimutuel (havuz) sistemi** ile çalışır. 15 maçın sonucunu (1/X/2) doğru tahmin etmeye dayalıdır. Bu modül, Spor Toto bültenlerini resmi API'den çekme, sistem kuponu üretme, sonuç değerlendirme ve havuz analitiği sağlar.

---

## 2. Veritabanı Değişiklikleri

### Yeni Tablolar

| Tablo | Açıklama |
|-------|----------|
| `toto_bulletins` | Haftalık bülten bilgileri (gameCycleNo, havuz, devir, tarihler) |
| `toto_bulletin_matches` | Bültendeki 15 maç (takım adları, lig, kickoff, sonuç) |
| `toto_results` | Bülten sonuçları (15/14/13/12 bilen sayıları ve ödüller) |
| `toto_coupons` | Kullanıcı kuponları (strateji, kolon sayısı, maliyet) |
| `toto_columns` | Kupon kolonları (15 karakter tahmin string'i, doğru sayısı) |

### Yeni Enumlar

- `TotoBulletinStatus`: `UPCOMING`, `IN_PROGRESS`, `COMPLETED`, `CANCELLED`
- `TotoMatchResult`: `HOME`, `DRAW`, `AWAY`

### Önemli Alanlar

- `toto_bulletin_matches.match_id` → Mevcut `matches` tablosuyla bağlantı (fuzzy match ile doldurulacak)
- `toto_columns.predictions` → `"1X2102X112X2101"` formatında 15 karakterlik string

---

## 3. Modül Yapısı

```
src/modules/spor-toto/
├── dto/spor-toto.dto.ts              # CreateBulletinDto, UpdateResultsDto, GenerateColumnsDto
├── services/
│   ├── toto-fetcher.service.ts       # sportotov2.iddaa.com API entegrasyonu
│   ├── toto-combinatorics.service.ts # Sistem kuponu üretme (full/reduced)
│   └── toto-analytics.service.ts     # Havuz dağılımı, EV hesabı, devir analizi
├── spor-toto.controller.ts           # 8 REST endpoint
├── spor-toto.service.ts              # Ana iş mantığı (CRUD + orchestration)
└── spor-toto.module.ts               # NestJS modül tanımı
```

---

## 4. API Endpoints

| Method | Endpoint | Açıklama |
|--------|----------|----------|
| `POST` | `/spor-toto/sync` | Resmi API'den güncel bülteni çek ve kaydet |
| `GET` | `/spor-toto/bulletins` | Bülten listesi (status filtresi, limit) |
| `GET` | `/spor-toto/bulletins/:id` | Bülten detayı (maçlar + sonuçlar dahil) |
| `POST` | `/spor-toto/bulletins` | Manuel bülten oluşturma |
| `PATCH` | `/spor-toto/bulletins/:id/results` | Maç sonuçlarını güncelle |
| `GET` | `/spor-toto/bulletins/:id/stats` | Havuz dağılımı ve EV istatistikleri |
| `GET` | `/spor-toto/history` | Devir tarihçesi ve trendler |
| `POST` | `/spor-toto/columns/generate` | Sistem kuponu üret (full/reduced) |
| `POST` | `/spor-toto/columns/evaluate` | Kolonları sonuçlara karşı değerlendir |

---

## 5. Servis Detayları

### TotoFetcherService

- **Kaynak:** `https://sportotov2.iddaa.com/SporToto`
- `fetchCurrentBulletin()` → Güncel bülten + 15 maç verisi
- Event adlarını parse edip `homeTeamName` / `awayTeamName` çıkartır
- Desteklenen lig formatları: `"eventName": "Blackpool-Burton Albion"`

### TotoCombinatoricsService

- **Full System:** Cartesian product — tüm kombinasyonları üretir
  - Örnek: 5 maçta çift seçim → 2⁵ = 32 kolon
- **Reduced System:** Belirli bir garanti seviyesiyle kolon sayısını düşürür
- `generateFullSystem(selections)` → `string[]` (her biri 15 karakter)
- `evaluateColumns(columns, results)` → `{ column, correctCount }[]`

### TotoAnalyticsService

- **Havuz dağılımı:** %35 (15 bilen), %20 (14 bilen), %20 (13 bilen), %25 (12 bilen)
- **Expected Value (EV):** `poolShare × probability - cost`
- **Devir analizi:** Son N bültenin devir trendi

---

## 6. Mevcut Durum & Bilinen Sorunlar

### ✅ Tamamlanan
- Veritabanı şeması (raw SQL ile oluşturuldu)
- Prisma Client türleri üretildi (`totoBulletin`, `totoResult` vs. FOUND)
- Tüm servisler implement edildi
- Build başarılı (`nest build` → 0 error)
- `app.module.ts`'e `SporTotoModule` kayıtlandı
- **AI Prediction Engine** implement edildi ✅

### ⚠️ Bekleyen
- **Dev server testi:** DB bağlantısı test edilmeli (`npm run start:dev`)
- **API sync testi:** `/spor-toto/sync` endpoint'inin çalıştığı doğrulanmalı
- **Canlı prediction testi:** Sync sonrası `POST /spor-toto/predict` çalıştırılmalı

---

## 7. AI Prediction Engine (Tamamlandı ✅)

### Yeni Servis: `toto-prediction.service.ts` (~490 satır)

Bülten maçlarını AI Engine ile analiz edip, **contrarian parimutuel strateji** ile akıllı sistem kuponu üreten tahmin motoru.

### Çalışma Akışı

```
POST /spor-toto/predict { bulletinId, strategy }
  ↓
1. Bülteni DB'den getir (15 maç)
  ↓
2. Her maç için:
   a) Fuzzy Match Link → live_matches / matches tablosundan matchId bul
      - Normalize: lowercase, Türkçe karakter çevir, ILIKE arama
      - ±3 gün tarih filtresi
   b) AI Engine → /v20plus/analyze/{matchId} çağır
      - Maç Sonucu market'ını bul, pick + confidence al
      - xG bazlı olasılık hesabı
   c) Fallback: AI erişilemezse → Tarihsel form analizi (son 10 maç)
  ↓
3. Contrarian Strateji uygula (maç başı seçim sayısı belirle)
  ↓
4. Combinatorics ile sistem kuponu üret
  ↓
5. EV raporu hesapla → PLAY / WAIT / HIGH_VALUE önerisi
```

### Contrarian Strateji (Fading the Public)

Parimutüel'de herkesin bildiği tahmin = düşük ödül. Motor, favori yığılmasının tersine pozisyon alır:

| AI Confidence | Seçim | Parimutüel Mantık |
|--------------|-------|-------------------|
| ≥ 65% | **Tek** (1/X/2) | Güvenli, ama contrarian bias ile çift olma ihtimali |
| 50-65% | **İkili** (en olası 2) | Varyans koruması — sürprizleri yakalar |
| < 50% | **Üçlü** (1X2 kapatma) | Maç çok belirsiz, herkes yanılabilir |

### 4 Strateji Modu

| Strateji | Max Kolon | Tek Eşiği | Çift Eşiği | Contrarian Bias | Açıklama |
|----------|----------|-----------|-----------|-----------------|----------|
| `CONSERVATIVE` | 100 | 55% | 35% | %0 | Düşük bütçe, güvenli |
| `BALANCED` | 500 | 60% | 40% | %15 | Orta risk, önerilen |
| `AGGRESSIVE` | 2.500 | 70% | 50% | %30 | Yüksek varyans, 15 bilme şansı |
| `FORMULA_6PCT` | 2.500 | 60% | 40% | %20 | Tam sistemden %6 örnekleme |

### EV-Bazlı Oynama Önerisi

Devir miktarına göre otomatik tavsiye:
- Devir > 50M TL → 🔥 **HIGH_VALUE** — Agresif oyna
- Devir > 5M TL → ✅ **PLAY** — Oynamaya değer
- Devir < 5M TL → ⏳ **WAIT** — Havuz büyümesini bekle

### Yeni Endpoint

| Method | Endpoint | Açıklama |
|--------|----------|----------|
| `POST` | `/spor-toto/predict` | AI tahmin + contrarian strateji + sistem kuponu üret |

**Request:**
```json
{
  "bulletinId": "<uuid>",
  "strategy": "BALANCED",
  "maxBudget": 500
}
```

**Response:** Match analizi (maç başı AI pick, confidence, contrarian skor), kupon (kolonlar, maliyet), EV raporu (havuz, devir, öneri)

---

## 8. Dosya Değişiklikleri Özeti

| Dosya | Değişiklik |
|-------|-----------|
| `prisma/schema.prisma` | +112 satır (5 model, 2 enum) |
| `src/modules/spor-toto/services/toto-prediction.service.ts` | **YENİ** — AI tahmin motoru (~490 satır) |
| `src/modules/spor-toto/services/toto-fetcher.service.ts` | Bülten çekici |
| `src/modules/spor-toto/services/toto-combinatorics.service.ts` | Kolon üretim motoru |
| `src/modules/spor-toto/services/toto-analytics.service.ts` | Havuz & EV analizi |
| `src/modules/spor-toto/dto/spor-toto.dto.ts` | +`GeneratePredictionDto`, +`EvaluateColumnsDto` |
| `src/modules/spor-toto/spor-toto.controller.ts` | +`POST /predict` endpoint |
| `src/modules/spor-toto/spor-toto.service.ts` | +`TotoPredictionService` entegrasyonu |
| `src/modules/spor-toto/spor-toto.module.ts` | +`HttpModule`, `ConfigModule`, `TotoPredictionService` |
| `src/app.module.ts` | `SporTotoModule` import |

---

## 9. Swagger & Endpoint Summary Güncellemesi

### Controller Swagger Dekoratörleri

Tüm 10 endpoint'e kapsamlı Swagger dekoratörleri eklendi:
- `@ApiOperation({ summary, description })` — Her endpoint için detaylı açıklama
- `@ApiParam({ name, description })` — Path parametreleri (`:id` → Bulletin UUID)
- `@ApiBody({ type: DtoClass })` — POST/PATCH body DTO referansları
- `@ApiResponse({ status, description })` — Başarı ve hata durumları (200, 201, 404, 409)

### backend_endpoints_swagger_summary.json

| Değişiklik | Detay |
|-----------|-------|
| Endpoint sayısı | 50 → **60** |
| Yeni tag | `Spor Toto` (10 endpoint) |
| Eklenen endpointler | `sync`, `bulletins` (CRUD), `stats`, `history`, `columns/generate`, `columns/evaluate`, `predict` |
| Yeni DTO şemaları | `CreateBulletinDto`, `UpdateResultsDto`, `GenerateColumnsDto`, `EvaluateColumnsDto`, `GeneratePredictionDto` |
| Tarih | `2026-02-17` → `2026-03-25` |

