import sys
import subprocess
import time
from datetime import datetime

def check_and_install_requirements():
    try:
        import win32com.client
        return True
    except ImportError:
        print("\nUYARI: Bu scriptin çalışması için 'pywin32' kütüphanesinin yüklü olması gerekir.")
        while True:
            response = input("Kütüphane şimdi yüklensin mi? (E/H): ").strip().lower()
            if response in ['e', 'evet']:
                try:
                    print("Yükleniyor, lütfen bekleyin...")
                    subprocess.check_call([sys.executable, "-m", "pip", "install", "pywin32"])
                    print("Kurulum başarıyla tamamlandı!\n")
                    return True
                except subprocess.CalledProcessError as e:
                    print(f"Kurulum başarısız oldu. Hata: {e}")
                    print("Lütfen terminalden 'pip install pywin32' komutunu manuel olarak çalıştırın.")
                    return False
            elif response in ['h', 'hayır']:
                print("Kurulum reddedildi. Program sonlandırılıyor.")
                return False
            else:
                print("Lütfen 'E' (Evet) veya 'H' (Hayır) giriniz.")

def device_monitor():
    if not check_and_install_requirements():
        return

    import win32com.client

    print("Windows Aygıt Yöneticisi İzleniyor (WQL Modu)...")
    print("Çıkış yapmak için Ctrl+C tuşlarına basın.")
    print("-" * 50)

    try:
        wmi = win32com.client.GetObject("winmgmts:root\\cimv2")
        query = "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PnPEntity'"
        watcher = wmi.ExecNotificationQuery(query)
        
        print("Sistem başarıyla dinleniyor. Lütfen bir USB aygıtı takıp çıkarın.")

        while True:
            try:
                event = watcher.NextEvent()
                device = event.TargetInstance
                event_type = event.Path_.Class
                name = device.Caption or device.Name or "Bilinmeyen Aygıt"
                category = device.PNPClass or "Bilinmeyen Kategori"
                device_id = device.DeviceID or "Kimlik Yok"
                timestamp = datetime.now().strftime("%H:%M:%S")

                if event_type == "__InstanceCreationEvent":
                    print(f"[{timestamp}] [+] {category} kategorisine \"{name}\" adında aygıt EKLENDİ.")
                    print(f"    -> Donanım Kimliği: {device_id}\n")
                
                elif event_type == "__InstanceDeletionEvent":
                    print(f"[{timestamp}] [-] {category} kategorisinden \"{name}\" adında bir aygıt KALDIRILDI.")
                    print(f"    -> Donanım Kimliği: {device_id}\n")

            except Exception as e:
                print(f"Hata detayı: {e}")
                time.sleep(0.5)

    except KeyboardInterrupt:
        print("\nİzleme sonlandırıldı.")
    except Exception as e:
        print(f"\nKritik Hata: {e}")
        print("Lütfen scripti yönetici olarak çalıştırmayı deneyin.")

if __name__ == "__main__":
    device_monitor()