import os
from pathlib import Path

# --- AYARLAR ---
PROJECT_DIR = Path(__file__).resolve().parent
OUTPUT_FILE = Path("PROJE_TAM_DOKUM.txt")  # Çıktı dosyasının adı

# Dahil edilecek dosya uzantıları (İsteğe bağlı, boş bırakılırsa hepsi alınır)
EXTENSIONS = {".py" , ".txt", ".md", ".json", ".yaml", ".yml", ".html", ".php", ".css", ".js"}  # Örnek uzantılar

# Hariç tutulacak klasörler veya dosyalar
IGNORE_DIRS = {"__pycache__", ".git", ".idea", ".vscode", "venv312", "env" , "vendor",  "mariadb", "build", "Program"}  # Örnek klasörler
IGNORE_FILES = {OUTPUT_FILE.name, "py.py", "py2.py","düzelt.py", "ai.py"} # Bu scriptin kendisi ve çıktı dosyası

def combine_files(root_dir, output_file):
    print(f"Proje birleştiriliyor: {root_dir} -> {output_file}")
    
    try:
        with open(output_file, "w", encoding="utf-8") as outfile:
            # Proje hakkında başlık
            outfile.write(f"PROJE DÖKÜMÜ\n")
            outfile.write(f"Kaynak Dizin: {root_dir}\n")
            outfile.write("="*50 + "\n\n")

            # Klasörleri gez
            for root, dirs, files in os.walk(root_dir):
                # Hariç tutulan klasörleri atla
                dirs[:] = [d for d in dirs if d not in IGNORE_DIRS]
                
                for file in files:
                    if file in IGNORE_FILES:
                        continue
                        
                    file_path = Path(root) / file
                    
                    # Uzantı kontrolü
                    if EXTENSIONS and file_path.suffix not in EXTENSIONS:
                        continue
                        
                    # Dosyayı oku ve yaz
                    try:
                        relative_path = file_path.relative_to(root_dir)
                        separator = f"\n\n{'='*20} {relative_path} {'='*20}\n"
                        outfile.write(separator)
                        
                        with open(file_path, "r", encoding="utf-8", errors="replace") as infile:
                            content = infile.read()
                            outfile.write(content)
                            
                        print(f"  + Eklendi: {relative_path}")
                        
                    except Exception as e:
                        print(f"  ! Hata ({file}): {e}")
                        outfile.write(f"\n[HATA: Dosya okunamadı - {e}]\n")

        print(f"\n İşlem tamamlandı. Tüm kodlar şuraya kaydedildi:\n{output_file.absolute()}")

    except Exception as e:
        print(f"Kritik Hata: {e}")

if __name__ == "__main__":
    combine_files(PROJECT_DIR, OUTPUT_FILE)