import os
import json
import time
import psutil
import cpuinfo
import platform
import csv
from datetime import datetime

class EcoTrace:
    def __init__(self, region_code="TR", carbon_limit=None):
        self.region_code = region_code
        self.carbon_limit = carbon_limit
        self.total_carbon = 0.0
        
        # --- DOSYA YOLU DÜZELTMESİ (os.path kullanımı) ---
        # Bu satır, core.py nerede yüklüyse o klasörü bulur
        self.base_dir = os.path.dirname(os.path.abspath(__file__))
        self.json_path = os.path.join(self.base_dir, "data.json")
        
        self.carbon_intensity = self._get_carbon_intensity()
        self.cpu_info = self._get_cpu_info()

        print("\n--- EcoTrace Baslatildi ---")
        print(f"Bolge: {self.region_code} ({self.carbon_intensity} gCO2/kWh)")
        print(f"Cekirdek: {self.cpu_info['cores']}")
        print(f"Islemci: {self.cpu_info['brand']}")
        print(f"Tahmini TDP: {self.cpu_info['tdp']}W")
        print("---------------------------\n")

    def _get_carbon_intensity(self):
        try:
            # Dosyayı artık 'json_path' üzerinden tam yol (absolute path) ile açıyoruz
            if os.path.exists(self.json_path):
                with open(self.json_path, "r", encoding="utf-8") as f:
                    data = json.load(f)
                    return data.get(self.region_code, 475)
            else:
                print(f"Uyari: data.json dosyasi {self.json_path} konumunda bulunamadi.")
                return 475 # Varsayılan değer (TR ortalaması)
        except Exception as e:
            print(f"Hata: Veri okunamadi. {e}")
            return 475

    def _get_cpu_info(self):
        info = cpuinfo.get_cpu_info()
        return {
            "brand": info.get("brand_raw", "Bilinmiyor"),
            "cores": psutil.cpu_count(logical=False),
            "tdp": 65 # Genel bir varsayılan, ileride geliştirilebilir
        }

    def track(self, func):
        def wrapper(*args, **kwargs):
            # --- TIME HATASI DÜZELTMESİ ---
            start_time = time.perf_counter() # import time sayesinde artık çalışır
            cpu_before = psutil.cpu_percent(interval=None)
            
            result = func(*args, **kwargs)
            
            cpu_after = psutil.cpu_percent(interval=None)
            end_time = time.perf_counter()
            
            duration = end_time - start_time
            avg_cpu_usage = (cpu_before + cpu_after) / 2
            
            # Karbon Hesaplama Formülü
            # (TDP * CPU Kullanımı * Süre) / (3600 * 1000) * Karbon Yoğunluğu
            power_usage = (self.cpu_info['tdp'] * (avg_cpu_usage / 100) * duration) / 3600
            carbon_emitted = (power_usage / 1000) * self.carbon_intensity
            
            self.total_carbon += carbon_emitted
            self._log_to_csv(func.__name__, duration, carbon_emitted)
            
            print(f"\n[EcoTrace] Fonksiyon: {func.__name__}")
            print(f"[EcoTrace] Sure: {duration:.4f} sn")
            print(f"[EcoTrace] Salinan Karbon: {carbon_emitted:.8f} gCO2")
            
            if self.carbon_limit and self.total_carbon > self.carbon_limit:
                print(f"!!! UYARI: Karbon limitiniz ({self.carbon_limit}g) asildi! Toplam: {self.total_carbon:.8f}g")
                
            return result
        return wrapper

    def _log_to_csv(self, func_name, duration, carbon):
        file_exists = os.path.isfile("ecotrace_log.csv")
        with open("ecotrace_log.csv", "a", newline="", encoding="utf-8") as f:
            writer = csv.writer(f)
            if not file_exists:
                writer.writerow(["Tarih", "Fonksiyon", "Sure(sn)", "Karbon(gCO2)", "Bolge"])
            writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S"), func_name, f"{duration:.4f}", f"{carbon:.8f}", self.region_code])