import sys
import numpy as np
import pandas as pd
D=sys.argv[1] if len(sys.argv)>1 else "."
L=pd.read_csv(f"{D}/prix_lignes_electriques_pays.csv",keep_default_na=False)
PV_FR,EOL_EU,HYD_EU=955.0,1583.0,2318.0
PV={"ZAF":1255,"RUS":1248,"KOR":1205,"USA":1109,"HUN":1078,"MEX":1050,"AUS":989,"BEL":965,"FRA":955,"CHL":954,"GBR":933,"CYP":854,"SVK":844,"ARG":830,"IDN":798,"SAU":794,"NLD":753,"ROU":743,"BRA":731,"PRT":727,"LVA":723,"TUR":716,"IND":715,"EST":711,"POL":705,"IRL":700,"LUX":686,"AUT":684,"DEU":678,"CHN":671,"ESP":671,"CZE":663,"BGR":659}
PV_EXTRA={"JPN":(1205,"pas de donnée IRENA, pris comme la Corée du Sud")}
EOL={"CHN":986,"BRA":1079,"ESP":1158,"IND":1208,"JPN":2384}
EOL_REG={"AF":1614,"CA":1757,"EA":1611,"EU":1583,"NA":1484,"OC":1610,"AS":2019,"SA":1563,"ME":2019}
HYD={"IND":1586,"BRA":1707,"CHN":2017}
HYD_REG={"AS":1972,"ME":2038,"EA":2400,"AF":2608,"SA":2583,"EU":2318,"NA":6040,"OC":4580,"CA":3967}
BORNES=(0.6,1.3)
EA={"ARM","AZE","GEO","RUS","TUR"}
ME={"BHR","IRN","IRQ","ISR","JOR","KWT","LBN","OMN","QAT","SAU","SYR","ARE","YEM","PSE"}
CA={"ATG","BHS","BRB","BLZ","CRI","CUB","DMA","DOM","SLV","GRD","GTM","HTI","HND","JAM","NIC","PAN","KNA","LCA","VCT","TTO","PRI","ABW","CUW"}
NA={"CAN","MEX","USA","GRL","BMU"}
def region(r):
    if r.iso in EA: return "EA"
    if r.iso in ME: return "ME"
    if r.iso in CA: return "CA"
    if r.iso in NA: return "NA"
    return {"AS":"AS","EU":"EU","AF":"AF","OC":"OC","SA":"SA","NA":"NA"}.get(r.continent,"AS")
L["region"]=[region(r) for r in L.itertuples()]
med_pv={}
for g,x in L.groupby("region"):
    v=[PV[i] for i in x.iso if i in PV]
    med_pv[g]=float(np.median(v)) if len(v)>=2 else float(np.median(list(PV.values())))
poste_fr=float(L.loc[L.iso=="FRA","poste_neuf_meur_gw"].iloc[0])
B={"v14_crete":dict(eolien=229.0,pv=9.05,hydraulique=102.2,reseau=22.0,mondial=0.5),
"v14_soleil":dict(pv=303.0,hydraulique=112.5,reseau=49.3,mondial=0.5),
"v14_mixte":dict(eolien=171.8,pv=132.0,hydraulique=107.5,reseau=49.3,mondial=0.5),
"v14_poste":dict(pv=303.0,hydraulique=112.5,reseau=59.3,mondial=0.5),
"v15":dict(pv=57.0,hydraulique=564.0,reseau=25.0,mondial=0.7),
"pacha_gold_sky":dict(hydraulique=1.0),
"hybrides_iles":dict(pv=0.8,reseau=0.2),
"v21_vent":dict(eolien=0.85,reseau=0.15)}
rows=[]
for r in L.itertuples():
    g=r.region
    if r.iso in PV: pv,spv=PV[r.iso]/PV_FR,"IRENA 2023, pays"
    elif r.iso in PV_EXTRA: pv,spv=PV_EXTRA[r.iso][0]/PV_FR,PV_EXTRA[r.iso][1]
    else: pv,spv=med_pv[g]/PV_FR,"IRENA 2023, médiane de la région" if sum(1 for i in L.iso[L.region==g] if i in PV)>=2 else "IRENA 2023, médiane des 33 pays"
    if r.iso in EOL: eo,seo=EOL[r.iso]/EOL_EU,"IRENA 2023, pays"
    else: eo,seo=EOL_REG[g]/EOL_EU,"IRENA 2023, région"
    if r.iso in HYD: hy,shy=HYD[r.iso]/HYD_EU,"IRENA 2016-2023, pays"
    else: hy,shy=HYD_REG[g]/HYD_EU,"IRENA 2016-2023, région"
    hy=min(max(hy,BORNES[0]),BORNES[1])
    re=float(r.poste_neuf_meur_gw)/poste_fr
    f=dict(pv=pv,eolien=eo,hydraulique=hy,reseau=re,mondial=1.0)
    o=dict(iso=r.iso,pays=r.pays,region_irena=g,niveau_prix=r.niveau_prix,pv=round(pv,3),eolien=round(eo,3),hydraulique=round(hy,3),reseau=round(re,3))
    for k,b in B.items():
        o[k]=round(sum(v*f[c] for c,v in b.items())/sum(b.values()),3)
    o.update(source_pv=spv,source_eolien=seo,source_hydraulique=shy)
    rows.append(o)
P=pd.DataFrame(rows).sort_values("iso")
P.to_csv(f"{D}/prix_centrales_pays.csv",index=False,lineterminator="\n")
print(P[P.iso.isin(["FRA","CHN","IND","USA","JPN","RUS","BRA","MEX","IRN","DEU","KOR","IDN","ETH","PER","YEM","MMR","THA"])][["iso","pv","eolien","hydraulique","reseau","v14_crete","v14_soleil","v15","hybrides_iles"]].to_string())
