# Kapadokya Kuralları: Önce vs Sonra

## 📊 Davranış Karşılaştırması

### Senaryo 1: Restaurant/Cafe Ekleme

#### ❌ ÖNCE (Kurallar Pasif)
```
GÜN 1:
  ✅ Göreme Açık Hava Müzesi (museum)
  ✅ Seten Restaurant (restaurant)
  ✅ Cafe Safak (cafe)              ← SORUN: Aynı günde hem restaurant hem cafe
  ✅ Uçhisar Kalesi (viewpoint)
```

#### ✅ SONRA (Kurallar Aktif)
```
GÜN 1:
  ✅ Göreme Açık Hava Müzesi (museum)
  ✅ Seten Restaurant (restaurant)
  ❌ Cafe Safak (cafe)              ← REDDEDİLDİ: LIMITED kuralı (günde 1 tane)
  ✅ Uçhisar Kalesi (viewpoint)
```

**Sonuç:** Günde sadece 1 restaurant VEYA 1 cafe eklenir.

---

### Senaryo 2: Hotel Ekleme

#### ❌ ÖNCE (Kurallar Pasif)
```
GÜN 1:
  ✅ Sultan Cave Suites (hotel)     ← SORUN: Hotel timeline'da görünüyor
  ✅ Göreme Açık Hava Müzesi (museum)
  ✅ Seten Restaurant (restaurant)
```

#### ✅ SONRA (Kurallar Aktif)
```
GÜN 1:
  ❌ Sultan Cave Suites (hotel)     ← REDDEDİLDİ: EXCLUDED kuralı
  ✅ Göreme Açık Hava Müzesi (museum)
  ✅ Seten Restaurant (restaurant)

BAŞLANGIÇ NOKTASI:
  📍 Sultan Cave Suites (hotel)     ← Sadece başlangıç noktası olarak kullanılır
```

**Sonuç:** Oteller asla timeline'a eklenmez, sadece başlangıç noktası olarak kullanılır.

---

### Senaryo 3: Aynı Yer Tekrarı

#### ❌ ÖNCE (Kurallar Pasif)
```
GÜN 1:
  ✅ Göreme Açık Hava Müzesi (museum)
  ✅ Seten Restaurant (restaurant)

GÜN 2:
  ✅ Göreme Açık Hava Müzesi (museum)  ← SORUN: Aynı müze tekrar eklendi
  ✅ Dibek Restaurant (restaurant)
```

#### ✅ SONRA (Kurallar Aktif)
```
GÜN 1:
  ✅ Göreme Açık Hava Müzesi (museum)
  ✅ Seten Restaurant (restaurant)

GÜN 2:
  ❌ Göreme Açık Hava Müzesi (museum)  ← REDDEDİLDİ: Tekrarlama kuralı
  ✅ Zelve Açık Hava Müzesi (museum)   ← Farklı müze eklendi
  ✅ Dibek Restaurant (restaurant)
```

**Sonuç:** Aynı yer farklı günlerde tekrar eklenemez.

---

### Senaryo 4: Flexible Yerler (Müze/Park)

#### ✅ ÖNCE (Kurallar Pasif)
```
GÜN 1:
  ✅ Göreme Açık Hava Müzesi (museum)
  ✅ Zelve Açık Hava Müzesi (museum)
  ✅ Paşabağ Vadisi (valley)
  ✅ Uçhisar Kalesi (viewpoint)
```

#### ✅ SONRA (Kurallar Aktif)
```
GÜN 1:
  ✅ Göreme Açık Hava Müzesi (museum)
  ✅ Zelve Açık Hava Müzesi (museum)  ← FLEXIBLE: Aynı tipten birden fazla olabilir
  ✅ Paşabağ Vadisi (valley)
  ✅ Uçhisar Kalesi (viewpoint)
```

**Sonuç:** FLEXIBLE yerler için davranış değişmedi (zaten doğru çalışıyordu).

---

### Senaryo 5: Balon Ekleme

#### ✅ ÖNCE (Kurallar Pasif)
```
GÜN 1:
  ✅ Göreme Açık Hava Müzesi (museum)
  ✅ Seten Restaurant (restaurant)

GÜN 2:
  ✅ Balon Turu (hot_air_balloon)    ← Zaten doğru çalışıyordu
  ✅ Zelve Açık Hava Müzesi (museum)
```

#### ✅ SONRA (Kurallar Aktif)
```
GÜN 1:
  ✅ Göreme Açık Hava Müzesi (museum)
  ✅ Seten Restaurant (restaurant)

GÜN 2:
  ✅ Balon Turu (hot_air_balloon)    ← FIXED_TIME: Trip başına 1 kez
  ✅ Zelve Açık Hava Müzesi (museum)
```

**Sonuç:** Balon kuralı için davranış değişmedi (zaten doğru çalışıyordu).

---

## 🎯 Kural Kategorileri

### FLEXIBLE (Esnek)
```typescript
['museum', 'park', 'viewpoint', 'valley', 'historical_site', 'church', 'cave', 'underground_city']
```

**Davranış:**
- ✅ Günde birden fazla olabilir
- ✅ Aynı tipten birden fazla yer eklenebilir
- ✅ Maksimum yer sayısına kadar serbest

**Örnek:**
```
GÜN 1:
  ✅ Göreme Açık Hava Müzesi (museum)
  ✅ Zelve Açık Hava Müzesi (museum)      ← 2. müze
  ✅ Derinkuyu Yeraltı Şehri (underground_city)
  ✅ Uçhisar Kalesi (viewpoint)
```

---

### LIMITED (Sınırlı)
```typescript
['restaurant', 'cafe']
```

**Davranış:**
- ✅ Günde sadece 1 tane
- ❌ Restaurant VEYA cafe (ikisi birden olamaz)
- ✅ Farklı günlerde farklı restaurant/cafe olabilir

**Örnek:**
```
GÜN 1:
  ✅ Seten Restaurant (restaurant)
  ❌ Cafe Safak (cafe)                    ← REDDEDİLDİ

GÜN 2:
  ✅ Dibek Restaurant (restaurant)        ← Farklı gün, farklı restaurant
```

---

### EXCLUDED (Hariç)
```typescript
['hotel', 'accommodation', 'lodging']
```

**Davranış:**
- ❌ Asla timeline'a eklenmez
- ✅ Sadece başlangıç noktası olarak kullanılır
- ✅ Trip metadata'sında saklanır

**Örnek:**
```
TIMELINE:
  ❌ Sultan Cave Suites (hotel)           ← Asla eklenmez

BAŞLANGIÇ NOKTASI:
  📍 Sultan Cave Suites (hotel)           ← Sadece burada kullanılır
```

---

### FIXED_TIME (Sabit Saatli)
```typescript
['hot_air_balloon', 'hot-air-balloon']
```

**Davranış:**
- ✅ Trip başına 1 kez
- ✅ Tercihen 2. günde (1 günlük seyahatte 1. gün)
- ✅ Sadece sunrise zaman bloğunda
- ❌ 2. balon eklenemez

**Örnek:**
```
GÜN 1:
  ✅ Göreme Açık Hava Müzesi (museum)

GÜN 2:
  ✅ Balon Turu (hot_air_balloon)         ← Trip başına 1 kez
  ✅ Zelve Açık Hava Müzesi (museum)

GÜN 3:
  ❌ 2. Balon Turu                        ← REDDEDİLDİ
  ✅ Paşabağ Vadisi (valley)
```

---

## 📈 İstatistikler

### Önce (Kurallar Pasif)
- ❌ Günde 2-3 restaurant/cafe eklenebiliyordu
- ❌ Oteller timeline'a eklenebiliyordu
- ❌ Aynı yer farklı günlerde tekrar eklenebiliyordu
- ✅ Balon kuralı çalışıyordu
- ✅ Flexible yerler çalışıyordu

### Sonra (Kurallar Aktif)
- ✅ Günde sadece 1 restaurant/cafe
- ✅ Oteller timeline'a eklenmez
- ✅ Aynı yer tekrar eklenemez
- ✅ Balon kuralı çalışıyor
- ✅ Flexible yerler çalışıyor

---

## 🔍 Kod Karşılaştırması

### FLEXIBLE PLACES Bölümü

#### ❌ ÖNCE
```typescript
for (const place of scoredPlaces) {
  if (dayPlaces.length >= MAX_PER_DAY) break;
  if (usedPlaceIds.has(place.id)) continue;
  if (isHotel(place)) continue;
  if (isRestaurant(place)) continue;  // ← Manuel kontrol

  dayPlaces.push(place);
  usedPlaceIds.add(place.id);
}
```

#### ✅ SONRA
```typescript
for (const place of scoredPlaces) {
  if (dayPlaces.length >= MAX_PER_DAY) break;
  if (usedPlaceIds.has(place.id)) continue;
  if (isHotel(place)) continue;
  
  // ✨ KURAL KONTROLÜ: Type-based validation
  if (!isValidForDay(place, dayPlaces, usedPlaceIds, { balloonAdded })) {
    continue;  // ← Otomatik kural kontrolü
  }

  dayPlaces.push(place);
  usedPlaceIds.add(place.id);
}
```

---

## 🎓 Öğrenilen Dersler

### 1. Type-Based Rules
- ✅ Her yer tipi için ayrı kurallar
- ✅ Kategori bazlı davranış
- ✅ Esnek ve genişletilebilir yapı

### 2. Validation Function
- ✅ Tek bir fonksiyon (`isValidForDay`)
- ✅ Tüm kuralları kontrol eder
- ✅ Kolay test edilebilir

### 3. Context Passing
- ✅ `balloonAdded` gibi trip-level state
- ✅ `dayPlaces` ile gün-level state
- ✅ `usedPlaceIds` ile trip-level tekrarlama kontrolü

---

## 🚀 Sonuç

### Aktive Edilen Kurallar
1. ✅ **LIMITED** - Restaurant/Cafe limiti
2. ✅ **EXCLUDED** - Hotel hariç tutma
3. ✅ **FLEXIBLE** - Müze/Park esnekliği (zaten çalışıyordu)
4. ✅ **FIXED_TIME** - Balon kuralı (zaten çalışıyordu)
5. ✅ **Tekrarlama** - Aynı yer tekrarı önleme (zaten çalışıyordu)

### Değişiklik Sayısı
- **Dosya:** 1 (`/src/db/api.ts`)
- **Satır:** 4 değişiklik
- **Import:** 3 yeni fonksiyon/sabit
- **Validation:** 2 yeni kontrol noktası

### Test Durumu
- ✅ TypeScript tip kontrolü geçti
- ✅ Lint hataları yok (sadece önceden var olanlar)
- ⏳ Kullanıcı testleri bekleniyor

---

**Tarih:** 2025  
**Durum:** ✅ Tamamlandı  
**Versiyon:** 1.0
