#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Enerji Dönüşümü, Sektörel Emisyonlar ve Yeşil Liman Elektriği: JRC EDGAR Sektörel Sera Gazları, Ember Şebeke Karbon Yoğunluğu, Rıhtımda Kara Elektriği Karşılaştırması ve IEA Küresel Denizcilik Emisyonları (1970–2025)
Energy Transition, Sectoral Emissions & Green Port Electricity: JRC EDGAR Sectoral GHG, Ember Grid Carbon Intensity, Shore-Power Comparison & IEA Global Shipping Emissions (1970–2025)
==============================================================================
GOMD Python SDK — Gerçek veriyle yeniden üretilebilir vaka çalışması / Reproducible real-data case study
Google Colab Install: !pip install -q --upgrade gomd

Veri kaynakları / Data sources (hepsi GOMD sunucusundan canlı çekilir / all fetched live from the GOMD server):
  - edgar_wb_total_ghg_excl_lulucf_mt_co2e, edgar_wb_co2_power_industry_mt, _industrial_combustion_mt, _transport_mt, _buildings_mt — JRC EDGAR / Dünya Bankası
  - ember_wind/solar/hydro_electricity_generation_twh, ember_low_carbon_electricity_share_pct, ember_carbon_intensity_electricity_gco2_kwh — Ember & Energy Institute
  - iea_co2_emissions_from_shipping_2015_2024, iea_shipping_activity_2015_2024, iea_shipping_energy_demand_2015_2024 — IEA (IEA_SHIPPING_WORLD)
  - IMO karbon dönüşüm faktörü Cf (MGO) = 3,206 t CO₂/t yakıt (MEPC.364(79)); yardımcı makine SFOC = 220 g/kWh varsayımdır

Not / Note: Bu betik sentetik veri üretmez. Bir seri sunucuda yoksa betik açık bir hata mesajıyla durur.
            This script never generates synthetic data. If a series is missing on the server, it stops with an explicit error.
"""

# ==============================================================================
# ADIM 0: GOMD Python SDK Kurulumu ve Canlı Veri Yardımcıları
# STEP 0: Install the GOMD Python SDK & Live Data Helpers
# ==============================================================================
import importlib
import os
import subprocess
import sys
import math
import json
from pathlib import Path
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

if hasattr(sys.stdout, "reconfigure"):
    try:
        sys.stdout.reconfigure(encoding="utf-8", errors="replace")
    except Exception:
        pass

_IN_COLAB = "google.colab" in sys.modules
_GOMD_WHEEL_URL = "https://gomd.pirireis.edu.tr/sdk/dist/gomd-2.0.1-py3-none-any.whl"
try:
    import gomd  # noqa: F401
    if _IN_COLAB:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", "--force-reinstall", "--no-cache-dir", _GOMD_WHEEL_URL])
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", "--force-reinstall", "--no-cache-dir", _GOMD_WHEEL_URL])

import gomd
for _mod_name in list(sys.modules.keys()):
    if _mod_name == "gomd" or _mod_name.startswith("gomd."):
        importlib.reload(sys.modules[_mod_name])
import gomd
from gomd import GOMDClient

client = GOMDClient("https://gomd.pirireis.edu.tr")


def fetch_gomd_records(indicator: str, entity: str, period_from=None, period_to=None, limit: int = 50000) -> pd.DataFrame:
    """
    GOMD sunucusundan bir göstergenin TEK bir varlık (ülke/havza) için ham kayıtlarını çeker.
    Yalnız istenen varlığın kayıtları tutulur; sunucu başka bir varlık döndürürse kullanılmaz.
    Returns a DataFrame with columns: period (str), value (float).
    """
    rows = client.get_series(indicator=indicator, entity=entity, period_from=period_from,
                             period_to=period_to, limit=limit, as_df=False)
    keep = [r for r in rows if str(r.get("entity_code") or "") == entity and r.get("value") is not None]
    if not keep:
        raise RuntimeError(f"GOMD sunucusunda veri yok: indicator={indicator}, entity={entity}")
    df = pd.DataFrame({"period": [str(r["period"]) for r in keep], "value": [float(r["value"]) for r in keep]})
    df = df.drop_duplicates("period").sort_values("period").reset_index(drop=True)
    print(f"📡 [GOMD] {indicator:<44} | {entity:<18} | N={len(df):<6} ({df['period'].iloc[0][:10]} – {df['period'].iloc[-1][:10]})")
    return df


def fetch_gomd_annual_series(indicator: str, entity: str, period_from: int = 1900, period_to: int = 2100,
                             how: str = "mean", min_count: int = 1) -> dict:
    """
    Yıllık seri döndürür: {yıl: değer}. Kayıtlar yıllık değilse (aylık/günlük) yıl içi ortalama alınır
    ve yalnız en az `min_count` kaydı olan yıllar tutulur. Returns {year: value}.
    """
    df = fetch_gomd_records(indicator, entity)
    df["year"] = df["period"].str[:4].astype(int)
    df = df[(df["year"] >= period_from) & (df["year"] <= period_to)]
    g = df.groupby("year")["value"]
    agg = g.mean() if how == "mean" else g.last()
    cnt = g.count()
    out = {int(y): float(v) for y, v in agg.items() if cnt[y] >= min_count}
    if not out:
        raise RuntimeError(f"Seçilen dönemde veri yok: indicator={indicator}, entity={entity}")
    return dict(sorted(out.items()))


def fmt_p(p: float) -> str:
    """p değerini okunur biçimde yazar / readable p-value."""
    return "<1e-6" if p < 1e-6 else f"{p:.4f}"


print(f"✅ GOMD Python SDK Sürümü / Version : v{gomd.__version__}")
print(f"🌐 Canlı Veri Sunucusu / Server     : {client.base_url}")
print(f"🏛️ Kurum / Institution              : Pîrî Reis Üniversitesi & T.C. Çevre, Şehircilik ve İklim Değişikliği Bakanlığı Çevre Yönetimi Genel Müdürlüğü — GOMD (COP31 Türkiye)")

# ==============================================================================
# ADIM 1: Türkiye sektörel emisyonları — JRC EDGAR (1970–2024)
# STEP 1: Türkiye sectoral emissions — JRC EDGAR (1970–2024)
# ==============================================================================
from gomd.stats import mann_kendall_sen, pettitt_changepoint, panel_fixed_effects, cointegration_eg_test

SECTORS = {
    "edgar_wb_co2_power_industry_mt": "Elektrik ve ısı üretimi CO₂",
    "edgar_wb_co2_industrial_combustion_mt": "Sanayi yakma CO₂",
    "edgar_wb_co2_transport_mt": "Ulaştırma CO₂",
    "edgar_wb_co2_buildings_mt": "Binalar CO₂",
}
tur_ghg = fetch_gomd_annual_series("edgar_wb_total_ghg_excl_lulucf_mt_co2e", "TUR", 1970, 2024)
tur_sec = {k: fetch_gomd_annual_series(k, "TUR", 1970, 2024) for k in SECTORS}
yrs = sorted(set(tur_ghg).intersection(*[set(s) for s in tur_sec.values()]))
df_tur = pd.DataFrame({"year": yrs, "total_ghg_mt": [tur_ghg[y] for y in yrs]})
for k in SECTORS:
    df_tur[k] = [tur_sec[k][y] for y in yrs]
df_tur["transport_share_pct"] = 100 * df_tur["edgar_wb_co2_transport_mt"] / df_tur["total_ghg_mt"]

y0, y1 = yrs[0], yrs[-1]
print(f"\n🏭 Türkiye toplam sera gazı (LULUCF hariç): {tur_ghg[y0]:.0f} Mt CO₂e ({y0}) → {tur_ghg[y1]:.0f} Mt CO₂e ({y1})")
rows = []
for k, name in SECTORS.items():
    s = tur_sec[k]; mk = mann_kendall_sen([s[y] for y in yrs if y >= 2000], t=[y for y in yrs if y >= 2000])
    rows.append({"Sektör": name, f"{y1} (Mt)": round(s[y1], 1), f"Toplamdaki payı {y1} (%)": round(100 * s[y1] / tur_ghg[y1], 1),
                 "Sen eğimi 2000+ (Mt/yıl)": round(mk["theil_sen_slope"], 2), "p": fmt_p(mk["p_value"])})
print(pd.DataFrame(rows).to_string(index=False))
pt_tr = pettitt_changepoint(df_tur["transport_share_pct"].tolist(), labels=yrs)
eg_tr = cointegration_eg_test(df_tur["edgar_wb_co2_transport_mt"].tolist(), df_tur["total_ghg_mt"].tolist())
print(f"🚚 Ulaştırmanın toplam içindeki payı: %{df_tur['transport_share_pct'].iloc[0]:.1f} ({y0}) → %{df_tur['transport_share_pct'].iloc[-1]:.1f} ({y1}); "
      f"Pettitt kırılma yılı {pt_tr['changepoint_label']} (p ≈ {fmt_p(pt_tr['p_value_approx'])})")
print(f"🔗 Engle-Granger (ulaştırma CO₂ → toplam GHG): ADF t = {eg_tr['engle_granger_adf_t_stat']:.2f} "
      f"(%5 kritik değer {eg_tr['critical_value_5pct']}; eşbütünleşik: {'evet' if eg_tr['cointegrated_at_5pct'] else 'hayır'})")

# ==============================================================================
# ADIM 2: Elektrik dönüşümü — Ember rüzgâr, güneş, hidro üretimi ve şebeke karbon yoğunluğu
# STEP 2: Electricity transition — Ember wind, solar, hydro generation & grid carbon intensity
# ==============================================================================
peers = ["TUR", "GRC", "ITA", "ESP", "FRA", "DEU", "EGY"]
wind = fetch_gomd_annual_series("ember_wind_electricity_generation_twh", "TUR", 1990)
solar = fetch_gomd_annual_series("ember_solar_electricity_generation_twh", "TUR", 1990)
hydro = fetch_gomd_annual_series("ember_hydro_electricity_generation_twh", "TUR", 1990)
lowc = fetch_gomd_annual_series("ember_low_carbon_electricity_share_pct", "TUR", 1990)
grid = {iso: fetch_gomd_annual_series("ember_carbon_intensity_electricity_gco2_kwh", iso, 1990) for iso in peers}
yl = max(set(wind) & set(solar) & set(hydro))
print(f"\n⚡ Türkiye elektrik üretimi {yl}: rüzgâr {wind[yl]:.1f} TWh, güneş {solar[yl]:.1f} TWh, hidro {hydro[yl]:.1f} TWh; "
      f"düşük karbonlu pay %{lowc[max(lowc)]:.1f} ({max(lowc)})")
print(f"   Rüzgâr + güneş: {wind[2010] + solar[2010]:.1f} TWh (2010) → {wind[yl] + solar[yl]:.1f} TWh ({yl})")

# Rıhtımda kara elektriği (OPS) karşılaştırması: gemi yardımcı makinesinin kWh başına CO₂'si
# IMO karbon dönüşüm faktörü (MGO/dizel) Cf = 3,206 t CO₂ / t yakıt (MEPC.364(79)).
# Yardımcı makine özgül yakıt tüketimi (SFOC) VARSAYIMDIR; gemiye göre değişir, kendi değerinizi yazın.
CF_MGO = 3.206              # t CO2 / t yakıt (IMO)
SFOC_AUX_G_KWH = 220.0      # g yakıt / kWh (varsayım)
aux_g_kwh = SFOC_AUX_G_KWH * CF_MGO   # g CO2 / kWh
grid_rows = []
for iso in peers:
    s = grid[iso]; yy = max(s)
    grid_rows.append({"ISO": iso, "2015 (gCO₂/kWh)": round(s.get(2015, float("nan"))), f"Son yıl": yy,
                      "Son değer (gCO₂/kWh)": round(s[yy]),
                      "Kara elektriğiyle CO₂ azaltımı (%)": round(100 * (1 - s[yy] / aux_g_kwh), 1)})
df_grid = pd.DataFrame(grid_rows).sort_values("Son değer (gCO₂/kWh)")
print(f"\n🔌 Şebeke karbon yoğunluğu ve rıhtımda kara elektriği (yardımcı makine ≈ {aux_g_kwh:.0f} gCO₂/kWh, SFOC {SFOC_AUX_G_KWH:.0f} g/kWh varsayımıyla):")
print(df_grid.to_string(index=False))
print("ℹ️  Yalnız doğrudan (bacadan) CO₂ karşılaştırılır; yakıtın üretim zinciri ve şebeke kayıpları dahil değildir.")

# ==============================================================================
# ADIM 3: Panel sabit etkiler — düşük karbonlu elektrik payı ile elektrik sektörü CO₂'si (7 ülke)
# STEP 3: Panel fixed effects — low-carbon electricity share vs power-sector CO₂ (7 countries)
# ==============================================================================
fe_rows = []
for iso in peers:
    pw = fetch_gomd_annual_series("edgar_wb_co2_power_industry_mt", iso, 1990, 2024)
    lc = fetch_gomd_annual_series("ember_low_carbon_electricity_share_pct", iso, 1990, 2024)
    for y in sorted(set(pw) & set(lc)):
        if pw[y] > 0:
            fe_rows.append({"iso": iso, "year": y, "log_power_co2": math.log(pw[y]), "lowcarbon_pct": lc[y]})
fe = panel_fixed_effects(fe_rows, "iso", "log_power_co2", "lowcarbon_pct")
print(f"\n📐 Ülke içi ilişki (1990–2024, {len(peers)} ülke): düşük karbonlu pay 1 puan arttığında elektrik sektörü CO₂'si "
      f"≈ %{100 * (math.exp(fe['beta_fe']) - 1):+.2f} (β = {fe['beta_fe']:+.4f}, t = {fe['t_stat']:.2f}, ülke içi R² = {fe['r_squared_within']:.2f}, N = {fe['n_obs']})")
print("    Talep artışı ve yakıt karışımı modele dahil değildir; sonuç korelasyondur.")

# ==============================================================================
# ADIM 4: Küresel denizcilik — IEA CO₂, taşıma faaliyeti ve enerji talebi (2015–2024)
# STEP 4: Global shipping — IEA CO₂, transport activity & energy demand (2015–2024)
# ==============================================================================
ship_co2 = fetch_gomd_annual_series("iea_co2_emissions_from_shipping_2015_2024", "IEA_SHIPPING_WORLD")   # Gt CO2
ship_act = fetch_gomd_annual_series("iea_shipping_activity_2015_2024", "IEA_SHIPPING_WORLD")             # trilyon ton-km
ship_ej = fetch_gomd_annual_series("iea_shipping_energy_demand_2015_2024", "IEA_SHIPPING_WORLD")          # EJ
sy = sorted(set(ship_co2) & set(ship_act) & set(ship_ej))
ship_int = {y: ship_co2[y] * 1e3 / ship_act[y] for y in sy}      # g CO2 / ton-km  (Gt·1e15 g / (trilyon·1e12 tkm))
ship_ci = {y: ship_co2[y] * 1e3 / ship_ej[y] for y in sy}        # Mt CO2 / EJ  (≈ g CO2 / MJ)
print(f"\n🌍 Küresel denizcilik (IEA): CO₂ {ship_co2[sy[0]]:.3f} Gt ({sy[0]}) → {ship_co2[sy[-1]]:.3f} Gt ({sy[-1]}); "
      f"karbon yoğunluğu {ship_int[sy[0]]:.2f} → {ship_int[sy[-1]]:.2f} g CO₂/ton-km")
_ci_note = ("neredeyse sabit: yakıt karışımı büyük ölçüde değişmemiş; yoğunluk düşüşü verimlilik ve rota/yük etkisidir"
            if abs(ship_ci[sy[-1]] - ship_ci[sy[0]]) < 1.0 else "değişim yakıt karışımındaki kaymayı gösterir")
print(f"   Enerji başına CO₂: {ship_ci[sy[0]]:.1f} → {ship_ci[sy[-1]]:.1f} g CO₂/MJ ({_ci_note})")

# ==============================================================================
# ADIM 5: 4 Panelli Görselleştirme / 4-panel figure
# ==============================================================================
fig, axes = plt.subplots(2, 2, figsize=(14, 9.5), dpi=120)
fig.patch.set_facecolor("#071324")
for ax in axes.flat:
    ax.set_facecolor("#0b1d36"); ax.tick_params(colors="#cbd5e1")
    for sp in ax.spines.values():
        sp.set_color("#1e3a5f")
    ax.grid(alpha=0.18, color="#64748b")
leg = dict(facecolor="#0f172a", edgecolor="#334155", labelcolor="#f8fafc", fontsize=8)
pal = {"TUR": "#f43f5e", "GRC": "#38bdf8", "ITA": "#22c55e", "ESP": "#f59e0b", "FRA": "#a78bfa", "DEU": "#e2e8f0", "EGY": "#fb923c"}

ax1 = axes[0, 0]
ax1.plot(df_tur["year"], df_tur["total_ghg_mt"], color="#f8fafc", lw=2.2, label="Toplam sera gazı (Mt CO₂e)")
for (k, name), c in zip(SECTORS.items(), ["#f59e0b", "#a78bfa", "#38bdf8", "#22c55e"]):
    ax1.plot(df_tur["year"], df_tur[k], color=c, lw=1.6, label=name)
ax1.set_ylabel("Mt / yıl", color="#cbd5e1")
ax1.set_title("A) Türkiye sektörel emisyonlar (JRC EDGAR)", color="#f8fafc", fontweight="bold"); ax1.legend(**leg)

ax2 = axes[0, 1]
ey = [y for y in sorted(set(wind) & set(solar) & set(hydro)) if y >= 1990]
ax2.stackplot(ey, [hydro[y] for y in ey], [wind[y] for y in ey], [solar[y] for y in ey],
              colors=["#38bdf8", "#22c55e", "#f59e0b"], labels=["Hidro", "Rüzgâr", "Güneş"], alpha=0.85)
ax2.set_ylabel("TWh", color="#cbd5e1")
ax2t = ax2.twinx(); gy = sorted(grid["TUR"])
ax2t.plot(gy, [grid["TUR"][y] for y in gy], color="#f43f5e", lw=1.8, label="Şebeke karbon yoğunluğu (gCO₂/kWh)")
ax2t.tick_params(colors="#fda4af"); ax2t.set_ylabel("gCO₂/kWh", color="#f43f5e")
ax2.set_title("B) Türkiye yenilenebilir elektrik ve şebeke yoğunluğu (Ember)", color="#f8fafc", fontweight="bold")
h1, l1 = ax2.get_legend_handles_labels(); h2, l2 = ax2t.get_legend_handles_labels(); ax2.legend(h1 + h2, l1 + l2, loc="upper left", **leg)

ax3 = axes[1, 0]
for iso in peers:
    s = grid[iso]; yy = sorted(s); ax3.plot(yy, [s[y] for y in yy], color=pal[iso], lw=1.6, label=iso)
ax3.axhline(aux_g_kwh, color="#94a3b8", ls="--", lw=1.2, label=f"Gemi yardımcı makinesi ≈ {aux_g_kwh:.0f} g/kWh (varsayım)")
ax3.set_ylabel("gCO₂/kWh", color="#cbd5e1")
ax3.set_title("C) Şebeke karbon yoğunluğu ve rıhtımda kara elektriği eşiği", color="#f8fafc", fontweight="bold")
ax3.legend(ncol=2, loc="lower left", bbox_to_anchor=(0.0, 0.12), **leg)

ax4 = axes[1, 1]
ax4.bar(sy, [ship_co2[y] * 1e3 for y in sy], color="#38bdf8", alpha=0.82, label="Küresel denizcilik CO₂ (Mt)")
ax4.set_ylabel("Mt CO₂", color="#38bdf8")
ax4t = ax4.twinx(); ax4t.plot(sy, [ship_int[y] for y in sy], color="#f59e0b", marker="o", lw=1.8, label="g CO₂ / ton-km")
ax4t.tick_params(colors="#fcd34d"); ax4t.set_ylabel("g CO₂ / ton-km", color="#f59e0b")
ax4.set_title("D) Küresel denizcilik emisyonu ve karbon yoğunluğu (IEA)", color="#f8fafc", fontweight="bold")
h1, l1 = ax4.get_legend_handles_labels(); h2, l2 = ax4t.get_legend_handles_labels(); ax4.legend(h1 + h2, l1 + l2, loc="lower left", **leg)

fig.suptitle("GOMD — Vaka Çalışması 9: Enerji dönüşümü, sektörel emisyonlar ve yeşil liman elektriği (gerçek veri)", color="#ffffff", fontsize=12.5, fontweight="bold")
plt.tight_layout()
fig.savefig("cs09_energy_transition_sectoral_ghg_green_shipping_corridors.png", dpi=140, bbox_inches="tight", facecolor=fig.get_facecolor())
plt.show()
