#!/bin/usr/python3
import argparse
import pandas as pd
import numpy as np
import sys



obs_file = '/home/disk/rocinante/DATA/temp/WRF/kingcounty/fluxes/access1.0_RCP85/fluxes_48.03125_-121.46875'
sim_file = '/home/disk/rocinante/DATA/temp/WRF/kingcounty/fluxes/access1.0_RCP85/fluxes_48.03125_-121.46875'


obs_years = [1950, 2009]
his_years = [1950, 2009]
fut_years = [2010, 2099]
col_names = ['year', 'month', 'day', 'prec', 'tmax', 'tmin', 'wspd']

odf = pd.read_csv(obs_file, header=None, sep='\s+')
odf.columns = col_names
sdf = pd.read_csv(sim_file, header=None, sep='\s+')
sdf.columns = col_names


obs = odf[(odf.year >= obs_years[0]) & (odf.year <= obs_years[1])].reset_index(drop=True)
his = sdf[(sdf.year >= his_years[0]) & (sdf.year <= his_years[1])].reset_index(drop=True)
fut = sdf[(sdf.year >= fut_years[0]) & (sdf.year <= fut_years[1])].reset_index(drop=True)



cutoff = 0.0039
#dry_day_thres_coarse = cutoff / 5 * 25.4
#dry_day_thres_fine = cutoff * 25.4
day_day_thres = cutoff * 25.4




print(his)
print(fut)
# Data length check
if (len(obs) == 0) | (len(his) == 0) | (len(fut) == 0):
    print("Not enough data")
    sys.exit




    
# Bin OBS and HIS into percentile bins with min streamflow    
n = 100
pcta = np.arange(0.0, 1.0 + 1.0/n, 1.0/n)
def pct_rank_qcut(series, n):
    edges = pd.Series([float(i) / n for i in range(n + 1)])
    f = lambda x: (edges >= x).values.argmax()
    return series.rank(pct=1).apply(f)



def rank_his(obs, his, var):    
    obs['Limit'] = pct_rank_qcut(obs[var], n)
    
    #obs = obs.groupby('Limit').mean().reset_index()
    #obs = obs.set_index('Limit').reindex(np.arange(1, n+1)).fillna(method='ffill').reset_index()
    #obs = obs.fillna(method='bfill').reset_index()
    
    #his['Limit'] = pd.qcut(his['Flow'], pcta)
    #his = his.groupby('Limit').mean().reset_index()
    #his['Rank'] = pcta[1:] * 100
    print(obs)

rank_his(obs, his, 'prec')


sys.exit()






# Sort OBS and HIS
obs = obs[['Flow']].sort_values(by='Flow').reset_index(drop=True)
his = his[['Flow']].sort_values(by='Flow').reset_index(drop=True)
obs = obs.dropna()

# Bin OBS and HIS into percentile bins with min streamflow
n = 100
pcta = np.arange(0.0, 1.0 + 1.0/n, 1.0/n)

def pct_rank_qcut(series, n):
    edges = pd.Series([float(i) / n for i in range(n + 1)])
    f = lambda x: (edges >= x).values.argmax()
    return series.rank(pct=1).apply(f)

obs['Limit'] = pct_rank_qcut(obs['Flow'], n)
obs = obs.groupby('Limit').mean().reset_index()
obs = obs.set_index('Limit').reindex(np.arange(1, n+1)).fillna(method='ffill').reset_index()
obs = obs.fillna(method='bfill').reset_index()

his['Limit'] = pd.qcut(his['Flow'], pcta)
his = his.groupby('Limit').mean().reset_index()
his['Rank'] = pcta[1:] * 100

# Calculate ratio
rdf = his.drop(['Flow'], axis=1)
#ratio.drop(columns=['Flow'], inplace=True)
rdf['Ratio'] = obs['Flow']/his['Flow']
rdf['Floor'] = rdf['Limit'].apply(lambda x: x.split(',')[0][1:]).astype(float)
rdf.at[0, 'Floor'] = 0

# Write out training table to file
rdf.to_csv(out_file, index=False)

















# Read OBS, HIS
obs = pd.read_csv(obs_file, sep="[-, /\t]*", engine='python',
                  header=None, na_values=naList)
obs.columns = hdr
his = pd.read_csv(his_file, sep="[-, /\t]*", engine='python',
                  header=None, na_values=naList)
his.columns = hdr

# Filter OBS to 1950~2017
obs = obs[(obs['Year'] >= 1950) & (obs['Year'] <= 2017)]

# Filter HIS to xxxx~2005
his = his[(his['Year'] <= 2005)]

