import os
from datetime import date
from app import app, db, Book, Task, apply_assignment_precedence

def get_or_create_book(name, category, grade, exam_type, keywords, exclude_keywords=None):
    """Veritabanında anahtar kelimelere göre kitap arar. Bulamazsa yeni oluşturur."""
    if exclude_keywords is None:
        exclude_keywords = []
        
    books = db.session.query(Book).all()
    for b in books:
        # İstenen tüm kelimeler kitap adında geçmeli
        if all(k.lower() in b.name.lower() for k in keywords):
            # İstenmeyen kelimeler geçmemeli (Örn: Biyoloji Bilgi Sarmal ararken Biyotik gelmesin)
            if any(ek.lower() in b.name.lower() for ek in exclude_keywords):
                continue
            return b
            
    # Eğer döngü bitti ve bulunamadıysa kitabı oluştur
    print(f"[*] Kitap bulunamadı, yenisi ekleniyor: {name}")
    new_book = Book(name=name, category=category, grade=grade, exam_type=exam_type)
    db.session.add(new_book)
    db.session.commit()
    return new_book

def add_bulk_tasks():
    print("--- Görev ve Ödevler Ekleniyor ---\n")
    
    # 1. Fizik MEB Kitabı
    fizik_meb = get_or_create_book("11. Sınıf Fizik MEB Kitabı", "Fizik", "11. Sınıf", "AYT", ["Fizik", "MEB"])
    
    # 2. Fizik Bilgi Sarmal (Fizik Soru Bankası olarak geçiyor)
    fizik_bs = get_or_create_book("11. Sınıf Fizik Soru Bankası", "Fizik", "11. Sınıf", "AYT", ["Fizik", "Soru", "Bankası"], ["MEB"])
    
    # 3. Matematik Orijinal
    mat_orj = get_or_create_book("11. Sınıf Orijinal Matematik Soru Bankası", "Matematik", "11. Sınıf", "AYT", ["Orijinal", "Matematik"])
    
    # 4. Biyoloji Bilgi Sarmal
    biyo_bs = get_or_create_book("11. Sınıf Biyoloji Soru Bankası", "Biyoloji", "11. Sınıf", "AYT", ["Biyoloji", "Soru", "Bankası"], ["Biyotik"])
    
    # 5. İlk Aşama Matematik
    ilk_asama = get_or_create_book("İlk Aşama Matematik Soru Bankası", "Matematik", "11. Sınıf", "TYT", ["İlk", "Aşama"])
    
    # 6. Paragraf 3D
    paragraf = get_or_create_book("3D Yayınları Paragraf Soru Bankası", "Türkçe", "11. Sınıf", "TYT", ["Paragraf"])
    
    # 7. Biyoloji MEB
    biyo_meb = get_or_create_book("11. Sınıf Biyoloji MEB Kitabı", "Biyoloji", "11. Sınıf", "AYT", ["Biyoloji", "MEB"])
    
    # 8. Biyotik Biyoloji
    biyo_biyotik = get_or_create_book("11. Sınıf Biyoloji Soru Bankası Biyotik", "Biyoloji", "11. Sınıf", "AYT", ["Biyotik"])
    
    # 9. Tarih (Veritabanında yok, oluşturulacak)
    tarih = get_or_create_book("11. Sınıf Tarih Soru Bankası", "Tarih", "11. Sınıf", "Yok", ["Tarih"])
    
    # 10. Kimya Aydın
    kimya_aydin = get_or_create_book("11. Sınıf Kimya Aydın", "Kimya", "11. Sınıf", "AYT", ["Kimya", "Aydın"])
    
    # 11. Kimya Bilgi Sarmal
    kimya_bs = get_or_create_book("11. Sınıf Kimya Bilgi Sarmal", "Kimya", "11. Sınıf", "AYT", ["Kimya", "Bilgi", "Sarmal"])
    
    # 12. Kimya Miray DAF 2.1
    kimya_miray = get_or_create_book("11. Sınıf Kimya Miray DAF 2.1", "Kimya", "11. Sınıf", "AYT", ["Miray", "2.1"])
    
    # 13. Matematik Bilgi Sarmal
    mat_bs = get_or_create_book("11. Sınıf Matematik Bilgi Sarmal", "Matematik", "11. Sınıf", "AYT", ["Matematik", "Bilgi", "Sarmal"], ["İlk"])


    # ------------------ GÖREV VERİLERİ ------------------
    # Senaryoya göre Ekim 2026: 12 (Pzt), 13 (Salı), 16 (Cuma)
    
    tasks_data = [
        # Fizik MEB Kitabı (Salı - Ayın 13'ü)
        {"book_id": fizik_meb.id, "type": "Ödev", "start": 30, "end": 39, "priority": 3, "desc": "Fizik ödevi atışların sonuna kadar.", "date": date(2026, 10, 13)},
        
        # Fizik Bilgi Sarmal 
        {"book_id": fizik_bs.id, "type": "Görev", "start": 43, "end": 68, "priority": 4, "desc": "Sürtünmeye kadar fizik.", "date": None},
        
        # Matematik Orijinal 
        {"book_id": mat_orj.id, "type": "Görev", "start": 126, "end": 143, "priority": 3, "desc": "Trigonometri işlediğiniz yere kadar.", "date": None},
        
        # Biyoloji Bilgi Sarmal 
        {"book_id": biyo_bs.id, "type": "Görev", "start": 48, "end": 83, "priority": 5, "desc": "Duyu organları ve sinir hücreleri.", "date": None},
        
        # İlk Aşama Matematik (3 Görev) -> "180'den 87'ye" sözünü 180-187 olarak düzeltiyorum
        {"book_id": ilk_asama.id, "type": "Görev", "start": 180, "end": 187, "priority": 3, "desc": "TYT Matematik Çalışma.", "date": None},
        {"book_id": ilk_asama.id, "type": "Görev", "start": 200, "end": 323, "priority": 3, "desc": "TYT Matematik Çalışma.", "date": None},
        {"book_id": ilk_asama.id, "type": "Görev", "start": 331, "end": 366, "priority": 3, "desc": "TYT Matematik Çalışma.", "date": None},
        
        # Paragraf 3D Yayınları (Cuma - Ayın 16'sı)
        {"book_id": paragraf.id, "type": "Ödev", "start": 48, "end": 81, "priority": 5, "desc": "Paragraf Ödevi", "date": date(2026, 10, 16)},
        
        # Biyoloji MEB Kitabı (Tarih net belirtilmemişti ancak Ödev olduğu için Cuma - 16 Ekim varsayıldı)
        {"book_id": biyo_meb.id, "type": "Ödev", "start": 54, "end": 63, "priority": 3, "desc": "Ders kitabı not alma.", "date": date(2026, 10, 16)},
        
        # Biyotik Biyoloji 
        {"book_id": biyo_biyotik.id, "type": "Görev", "start": 1, "end": 76, "priority": 4, "desc": "Geldiğimiz yere kadar biyotik biyoloji.", "date": None},
        
        # Tarih (Pazartesi - Ayın 12'si)
        {"book_id": tarih.id, "type": "Ödev", "start": 1, "end": 25, "priority": 4, "desc": "Tarih ödevi", "date": date(2026, 10, 12)},
        
        # Kimya Aydın 
        {"book_id": kimya_aydin.id, "type": "Görev", "start": 1, "end": 72, "priority": 3, "desc": "Geldiğimiz yere kadar Aydın Kimya.", "date": None},
        
        # Kimya Bilgi Sarmal 
        {"book_id": kimya_bs.id, "type": "Görev", "start": 70, "end": 93, "priority": 3, "desc": "Kimya Bilgi Sarmal geldiğimiz yere kadar.", "date": None},
        
        # Miray DAF 2.1 (Pazartesi - Ayın 12'si) -> "0'dan 32'ye" geçersiz olacağından "1'den 32'ye" yapıldı
        {"book_id": kimya_miray.id, "type": "Ödev", "start": 1, "end": 32, "priority": 5, "desc": "Kimya ödevi hızın ilk bölümü, hız denklemlerine kadar.", "date": date(2026, 10, 12)},
        
        # Matematik Bilgi Sarmal (1 Görev, 2 Ödev)
        {"book_id": mat_bs.id, "type": "Görev", "start": 111, "end": 128, "priority": 4, "desc": "Çokgenler ilk kısım.", "date": None},
        {"book_id": mat_bs.id, "type": "Ödev", "start": 129, "end": 140, "priority": 3, "desc": "Çokgenler 2. kısım", "date": date(2026, 10, 16)},
        {"book_id": mat_bs.id, "type": "Ödev", "start": 150, "end": 161, "priority": 5, "desc": "Matematik Ödevi", "date": date(2026, 10, 13)},
    ]

    for data in tasks_data:
        # Eğer Ödev ise, Odak Planım'ın çakışma (precedence) mantığını işlet.
        if data["type"] == "Ödev":
            apply_assignment_precedence(data["book_id"], data["start"], data["end"])
            
        new_task = Task(
            book_id=data["book_id"],
            task_type=data["type"],
            start_page=data["start"],
            end_page=data["end"],
            priority=data["priority"],
            description=data["desc"],
            control_date=data["date"]
        )
        db.session.add(new_task)
        db.session.commit()
        
        date_str = f" (Kontrol: {data['date'].strftime('%d.%m.%Y')})" if data['date'] else ""
        print(f"[+] Eklendi: {data['type']} | Sayfa: {data['start']}-{data['end']} | Kitap ID: {data['book_id']}{date_str}")
        
    print("\n[BAŞARILI] Bütün işler sorunsuz bir şekilde sisteme aktarıldı!")

if __name__ == "__main__":
    with app.app_context():
        add_bulk_tasks()