import sys, csv, gettext
import pandas as pd
import pycountry
dossier = sys.argv[1] if len(sys.argv) > 1 else "."
USD_EUR = 0.92
PRIX_TH = {"charbon": (12.0, 0.37), "gaz": (35.0, 0.50), "petrole": (40.0, 0.35)}
fr = gettext.translation("iso3166-1", pycountry.LOCALES_DIR, languages=["fr"])
NOMS_GPP = {"UK": "GBR", "USA": "USA", "N. Maced.": "MKD", "Dom. Rep.": "DOM", "Bosnia & Herz.": "BIH", "Burma": "MMR", "Swaziland": "SWZ", "Ivory Coast": "CIV", "DR Congo": "COD", "Laos": "LAO", "Russia": "RUS", "Iran": "IRN", "South Korea": "KOR", "Taiwan": "TWN", "Turkey": "TUR", "Moldova": "MDA", "Vietnam": "VNM", "Syria": "SYR", "Bahamas": "BHS", "Hong Kong": "HKG", "Cape Verde": "CPV", "UAE": "ARE", "Czech Republic": "CZE", "Trinidad & Tobago": "TTO", "Venezuela": "VEN", "Tanzania": "TZA"}
def iso3(nom):
    if nom in NOMS_GPP:
        return NOMS_GPP[nom]
    return pycountry.countries.lookup(nom).alpha_3
NOMS_FR = {"RUS": "Russie", "REU": "La Réunion", "VIR": "Îles Vierges américaines", "PSE": "Palestine", "SLB": "Îles Salomon", "SHN": "Sainte-Hélène", "FLK": "Îles Malouines", "OWID_KOS": "Kosovo", "BOL": "Bolivie", "VEN": "Venezuela", "IRN": "Iran", "TZA": "Tanzanie", "COD": "République démocratique du Congo", "MDA": "Moldavie", "SYR": "Syrie", "LAO": "Laos", "PRK": "Corée du Nord", "KOR": "Corée du Sud", "MKD": "Macédoine du Nord", "CZE": "Tchéquie", "VNM": "Viêt Nam", "TWN": "Taïwan", "MMR": "Birmanie", "FSM": "Micronésie", "SWZ": "Eswatini"}
def nom_fr(code):
    if code in NOMS_FR:
        return NOMS_FR[code]
    p = pycountry.countries.get(alpha_3=code)
    return fr.gettext(getattr(p, "common_name", None) or p.name) if p else code
d = pd.read_csv(f"{dossier}/owid-energy-data.csv")
d.loc[d.country == "Kosovo", "iso_code"] = "OWID_KOS"
d = d[d.iso_code.notna() & (~d.iso_code.astype(str).str.startswith("OWID") | (d.iso_code == "OWID_KOS")) & d.electricity_generation.notna() & d.fossil_electricity.notna()]
d = d[d.year >= 2020].sort_values("year").groupby("iso_code").tail(1).set_index("iso_code")
prix = pd.read_csv(f"{dossier}/prix_electricite_globalpetrolprices_2023_2025.csv", sep=";")
prix["iso"] = prix.pays.map(iso3)
prix = prix.set_index("iso")
a4 = pd.read_csv(f"{dossier}/plan_mondial_artesia_4_pays.csv", keep_default_na=False)
a4["iso"] = a4.pays.map(lambda c: "OWID_KOS" if c == "XK" else pycountry.countries.get(alpha_2=c).alpha_3)
a4 = a4.set_index("iso").twh
lignes = []
for code, r in d.iterrows():
    fos = r.fossil_electricity
    ch, gz, pe = (r.coal_electricity if pd.notna(r.coal_electricity) else 0), (r.gas_electricity if pd.notna(r.gas_electricity) else 0), (r.oil_electricity if pd.notna(r.oil_electricity) else 0)
    tot = ch + gz + pe
    comb = sum(v * PRIX_TH[k][0] / PRIX_TH[k][1] for k, v in (("charbon", ch), ("gaz", gz), ("petrole", pe))) / tot if tot > 0 else None
    dem = r.electricity_demand if pd.notna(r.electricity_demand) else r.electricity_generation
    pm = prix.menages_usd_kwh.get(code)
    pe_ = prix.entreprises_usd_kwh.get(code)
    lignes.append({"iso": code, "pays": nom_fr(code), "annee": int(r.year), "production_twh": round(r.electricity_generation, 2), "demande_twh": round(dem, 2), "fossile_twh": round(fos, 2), "part_fossile_pct": round(100 * fos / r.electricity_generation, 1) if r.electricity_generation > 0 else 0, "charbon_twh": round(ch, 2), "gaz_twh": round(gz, 2), "petrole_twh": round(pe, 2), "prix_menages_eur_kwh": round(pm * USD_EUR, 3) if pd.notna(pm) else "", "prix_entreprises_eur_kwh": round(pe_ * USD_EUR, 3) if pd.notna(pe_) else "", "combustible_eur_mwh": round(comb) if comb else "", "combustible_meur_an": round(fos * comb) if comb else 0, "artesia_4_twh": int(a4.get(code, 0)), "artesia_4_sur_fossile": round(a4.get(code, 0) / fos, 2) if fos > 0 else ""})
t = pd.DataFrame(lignes).sort_values("fossile_twh", ascending=False)
t.to_csv(f"{dossier}/electricite_pays_prix_part_fossile.csv", index=False, quoting=csv.QUOTE_MINIMAL)
print(len(t), "pays", round(t.production_twh.sum()), "TWh", round(t.fossile_twh.sum()), "TWh fossiles", round(t.combustible_meur_an.sum() / 1000), "Md EUR de combustible", "prix manquants", (t.prix_menages_eur_kwh == "").sum())
