# Kapadokya Kuralları Aktivasyonu

## 📋 Özet

Kapadokya kuralları dosyasında (`/src/config/cappadocia-rules.ts`) tanımlı ancak kullanılmayan kurallar başarıyla aktive edildi. Artık otomatik seyahat planı oluşturma (AUTO_SEED) sırasında tüm yer tipi kuralları uygulanıyor.

## ✅ Aktive Edilen Kurallar

### 1. **LIMITED Yerler** (Restaurant, Cafe)
```typescript
// ✅ Günde sadece 1 restaurant VEYA 1 cafe
// ❌ Aynı günde hem restaurant hem cafe olamaz
```

**Davranış:**
- Bir günde maksimum 1 LIMITED tip yer (restaurant veya cafe)
- Eğer günde zaten bir restaurant varsa, cafe eklenemez
- Eğer günde zaten bir cafe varsa, restaurant eklenemez

### 2. **EXCLUDED Yerler** (Hotel)
```typescript
// ✅ Oteller timeline'a asla eklenmez
// ✅ Sadece başlangıç noktası olarak kullanılır
```

**Davranış:**
- Hotel tipi yerler timeline'a hiçbir zaman eklenmez
- Oteller sadece seyahatin başlangıç noktası olarak kullanılır
- `isValidForDay()` fonksiyonu otelleri otomatik olarak reddeder

### 3. **FLEXIBLE Yerler** (Museum, Park, Viewpoint, Valley, vb.)
```typescript
// ✅ Günde birden fazla olabilir
// ✅ Aynı tipten birden fazla yer eklenebilir
```

**Davranış:**
- Bir günde birden fazla müze, park, viewpoint eklenebilir
- Aynı tipten (örneğin 2 müze) yer eklenebilir
- Esneklik sağlar, günlük maksimum yer sayısına kadar

### 4. **FIXED_TIME Yerler** (Balloon)
```typescript
// ✅ Trip başına sadece 1 kez
// ✅ shouldAddBalloon() ile kontrol ediliyor (zaten çalışıyor)
```

**Davranış:**
- Balon uçuşu trip başına sadece 1 kez eklenir
- Tercihen 2. günde eklenir (1 günlük seyahatte 1. gün)
- `shouldAddBalloon()` fonksiyonu ile kontrol edilir (zaten aktifti)

### 5. **Tekrarlama Kuralı**
```typescript
// ✅ Aynı yer farklı günlerde tekrar eklenemez
// ✅ usedPlaceIds Set'i ile kontrol ediliyor
```

**Davranış:**
- Bir yer bir kez kullanıldıktan sonra başka günlerde tekrar eklenemez
- `usedPlaceIds` Set'i ile trip seviyesinde takip edilir
- Örnek: Göreme Açık Hava Müzesi 1. günde eklendiyse, 2. günde eklenemez

## 🔧 Yapılan Değişiklikler

### Dosya: `/src/db/api.ts`

#### 1️⃣ Import Listesi Genişletildi (Satır 894-904)

**ÖNCE:**
```typescript
const {
  shouldAddBalloon,
  getPlacesByInterests,
  getTypicalDuration,
  MAX_PLACES_PER_DAY,
  MIN_PLACES_PER_DAY,
  BALLOON_PLACE_TYPE,
} = await import('@/config/cappadocia-rules');
```

**SONRA:**
```typescript
const {
  shouldAddBalloon,
  getPlacesByInterests,
  getTypicalDuration,
  MAX_PLACES_PER_DAY,
  MIN_PLACES_PER_DAY,
  BALLOON_PLACE_TYPE,
  isValidForDay,           // ← YENİ: Yer validasyonu
  getPlaceCategory,        // ← YENİ: Yer kategorisi
  PLACE_TYPE_CATEGORIES,   // ← YENİ: Kategori tanımları
} = await import('@/config/cappadocia-rules');
```

#### 2️⃣ FLEXIBLE PLACES Kısmına Kural Kontrolü Eklendi (Satır 1027-1040)

**ÖNCE:**
```typescript
/* ---- FLEXIBLE PLACES (museum, park, viewpoint...) -------------- */
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;

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

**SONRA:**
```typescript
/* ---- FLEXIBLE PLACES (museum, park, viewpoint...) -------------- */
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 (LIMITED, EXCLUDED, FLEXIBLE)
  if (!isValidForDay(place, dayPlaces, usedPlaceIds, { balloonAdded })) {
    continue;
  }

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

#### 3️⃣ MIN FILL Kısmına Kural Kontrolü Eklendi (Satır 1073-1088)

**ÖNCE:**
```typescript
/* ---- MIN FILL -------------------------------------------------- */
if (dayPlaces.length < MIN_PER_DAY) {
  for (const p of scoredPlaces) {
    if (dayPlaces.length >= MIN_PER_DAY) break;
    if (usedPlaceIds.has(p.id)) continue;
    if (isHotel(p)) continue;

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

**SONRA:**
```typescript
/* ---- MIN FILL -------------------------------------------------- */
if (dayPlaces.length < MIN_PER_DAY) {
  for (const p of scoredPlaces) {
    if (dayPlaces.length >= MIN_PER_DAY) break;
    if (usedPlaceIds.has(p.id)) continue;
    if (isHotel(p)) continue;

    // ✨ KURAL KONTROLÜ: Type-based validation (LIMITED, EXCLUDED, FLEXIBLE)
    if (!isValidForDay(p, dayPlaces, usedPlaceIds, { balloonAdded })) {
      continue;
    }

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

#### 4️⃣ TypeScript Tipi Düzeltildi (Satır 950)

**ÖNCE:**
```typescript
const usedPlaceIds = new Set();
```

**SONRA:**
```typescript
const usedPlaceIds = new Set<string>();
```

## 🧪 Test Senaryoları

### ✅ Senaryo 1: Restaurant Limiti
**Beklenen:** Günde sadece 1 restaurant/cafe  
**Test:** 2 gün, balloon yok, 2 restaurant seçili  
**Sonuç:** Her gün 1 restaurant eklenmeli

### ✅ Senaryo 2: Balloon Kuralı
**Beklenen:** Sadece 1 balon, 2. günde  
**Test:** 3 gün, balloon seçili  
**Sonuç:** 2. gün balon eklenmeli, diğer günlerde olmamalı

### ✅ Senaryo 3: Hotel Exclusion
**Beklenen:** Hiçbir otel timeline'da görünmemeli  
**Test:** Otelli trip oluştur  
**Sonuç:** Otel sadece başlangıç noktası olmalı

### ✅ Senaryo 4: Aynı Yer Tekrarı
**Beklenen:** Aynı müze farklı günlerde tekrar eklenmemeli  
**Test:** 2 gün, aynı müze 2 kez seçili  
**Sonuç:** Müze sadece 1 gün eklenmeli

### ✅ Senaryo 5: Flexible Yerler
**Beklenen:** Aynı günde birden fazla müze/park eklenebilmeli  
**Test:** 3 gün, 5 müze seçili  
**Sonuç:** Günlük maksimuma kadar müze eklenebilmeli

## 📊 Kural Kategorileri

### FLEXIBLE (Esnek)
```typescript
['museum', 'park', 'viewpoint', 'valley', 'historical_site', 'church', 'cave', 'underground_city']
```
- Günde birden fazla olabilir
- Aynı tipten birden fazla yer eklenebilir

### LIMITED (Sınırlı)
```typescript
['restaurant', 'cafe']
```
- Günde sadece 1 tane
- Restaurant VEYA cafe (ikisi birden olamaz)

### EXCLUDED (Hariç)
```typescript
['hotel', 'accommodation', 'lodging']
```
- Asla timeline'a eklenmez
- Sadece başlangıç noktası

### FIXED_TIME (Sabit Saatli)
```typescript
['hot_air_balloon', 'hot-air-balloon']
```
- Trip başına 1 kez
- Özel zaman kuralları (sunrise)

## 🎯 Etki

### Önceki Durum
- ❌ Aynı günde birden fazla restaurant eklenebiliyordu
- ❌ Oteller timeline'a eklenebiliyordu
- ❌ Yer tipi kategorileri kullanılmıyordu
- ✅ Balon kuralı çalışıyordu
- ✅ Tekrarlama önleme çalışıyordu

### Yeni Durum
- ✅ Günde sadece 1 restaurant/cafe
- ✅ Oteller timeline'a eklenmez
- ✅ Yer tipi kategorileri aktif
- ✅ Balon kuralı çalışıyor (değişmedi)
- ✅ Tekrarlama önleme çalışıyor (değişmedi)

## 🔍 İlgili Dosyalar

1. **Kural Tanımları:** `/src/config/cappadocia-rules.ts`
   - Tüm kuralların tanımlandığı dosya
   - `isValidForDay()` fonksiyonu
   - `getPlaceCategory()` fonksiyonu
   - `PLACE_TYPE_CATEGORIES` sabiti

2. **Kural Uygulaması:** `/src/db/api.ts`
   - `generateAutoSeedItinerary()` fonksiyonu
   - Satır 887-1150 arası
   - AUTO_SEED modu için otomatik plan oluşturma

## 📝 Notlar

- Tüm değişiklikler geriye uyumludur
- Mevcut seyahatler etkilenmez
- Sadece yeni oluşturulan AUTO_SEED seyahatler yeni kuralları kullanır
- TypeScript tip güvenliği sağlandı
- Lint hataları yok (sadece önceden var olan hatalar mevcut)

## 🚀 Sonraki Adımlar

1. ✅ Kurallar aktive edildi
2. ⏳ Kullanıcı testleri yapılmalı
3. ⏳ Farklı senaryolar denenmeliş
4. ⏳ Gerekirse kural parametreleri ayarlanmalı (örn: günlük maksimum yer sayısı)

---

**Tarih:** 2025  
**Durum:** ✅ Tamamlandı  
**Etkilenen Dosyalar:** 1 (`/src/db/api.ts`)  
**Değişiklik Sayısı:** 4 (3 fonksiyonel + 1 tip düzeltmesi)
