#!/usr/bin/env python3
"""
Скрипт для удаления Log.d/e/w/i/v вызовов из Kotlin файлов
"""

import os
import re
import sys

def remove_logs_from_file(filepath):
    """Удаляет Log.d/e/w/i/v вызовы из файла"""
    
    with open(filepath, 'r', encoding='utf-8') as f:
        content = f.read()
    
    original_content = content
    
    # Паттерн для Log.d/e/w/i/v с учетом многострочных вызовов
    # Матчит: Log.d("TAG", "message") или Log.d(TAG, "message", exception)
    patterns = [
        # Простые однострочные логи
        r'^\s*Log\.[dewiv]\([^)]*\)\s*\n',
        # Многострочные логи (с переносами внутри скобок)
        r'^\s*Log\.[dewiv]\([^)]*\n[^)]*\)\s*\n',
        r'^\s*Log\.[dewiv]\([^)]*\n[^)]*\n[^)]*\)\s*\n',
        r'^\s*Log\.[dewiv]\([^)]*\n[^)]*\n[^)]*\n[^)]*\)\s*\n',
        # android.util.Log
        r'^\s*android\.util\.Log\.[dewiv]\([^)]*\)\s*\n',
    ]
    
    for pattern in patterns:
        content = re.sub(pattern, '', content, flags=re.MULTILINE)
    
    # Более агрессивный паттерн для оставшихся логов
    # Находит Log.X( и удаляет до закрывающей скобки
    def remove_log_call(match):
        return ''
    
    # Паттерн который находит Log.X(...) учитывая вложенные скобки
    log_pattern = r'^\s*(?:android\.util\.)?Log\.[dewiv]\s*\([^()]*(?:\([^()]*\)[^()]*)*\)\s*\n?'
    content = re.sub(log_pattern, '', content, flags=re.MULTILINE)
    
    if content != original_content:
        with open(filepath, 'w', encoding='utf-8') as f:
            f.write(content)
        return True
    return False

def find_kotlin_files(directory):
    """Находит все .kt файлы в директории"""
    kotlin_files = []
    for root, dirs, files in os.walk(directory):
        # Пропускаем build директории
        dirs[:] = [d for d in dirs if d not in ['build', '.gradle', '.idea']]
        for file in files:
            if file.endswith('.kt'):
                kotlin_files.append(os.path.join(root, file))
    return kotlin_files

def count_logs_in_file(filepath):
    """Считает количество Log вызовов в файле"""
    with open(filepath, 'r', encoding='utf-8') as f:
        content = f.read()
    
    pattern = r'(?:android\.util\.)?Log\.[dewiv]\s*\('
    matches = re.findall(pattern, content)
    return len(matches)

def main():
    # Директория с исходниками
    src_dir = '/Users/ruslanmakhmatov/Desktop/Work/rosette-app/rosetta-android/app/src/main/java/com/rosetta/messenger'
    
    if not os.path.exists(src_dir):
        print(f"Директория не найдена: {src_dir}")
        sys.exit(1)
    
    kotlin_files = find_kotlin_files(src_dir)
    print(f"Найдено {len(kotlin_files)} Kotlin файлов")
    
    # Сначала считаем логи
    total_logs_before = 0
    files_with_logs = []
    for filepath in kotlin_files:
        count = count_logs_in_file(filepath)
        if count > 0:
            total_logs_before += count
            files_with_logs.append((filepath, count))
    
    print(f"Найдено {total_logs_before} Log вызовов в {len(files_with_logs)} файлах")
    
    if '--dry-run' in sys.argv:
        print("\n[DRY RUN] Файлы с логами:")
        for filepath, count in sorted(files_with_logs, key=lambda x: -x[1]):
            print(f"  {count:3d} логов: {os.path.basename(filepath)}")
        return
    
    # Удаляем логи
    modified_count = 0
    for filepath in kotlin_files:
        if remove_logs_from_file(filepath):
            modified_count += 1
            print(f"✓ {os.path.basename(filepath)}")
    
    # Считаем оставшиеся
    total_logs_after = 0
    for filepath in kotlin_files:
        total_logs_after += count_logs_in_file(filepath)
    
    print(f"\n{'='*50}")
    print(f"Изменено файлов: {modified_count}")
    print(f"Логов до: {total_logs_before}")
    print(f"Логов после: {total_logs_after}")
    print(f"Удалено: {total_logs_before - total_logs_after}")
    
    if total_logs_after > 0:
        print(f"\n⚠️  Осталось {total_logs_after} логов (возможно сложные многострочные)")

if __name__ == '__main__':
    main()
