# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

from ocw.dataset import Bounds
import ocw.data_source.local as local
import ocw.dataset_processor as dsp
import ocw.metrics as metrics
import ocw.plotter as plotter

import numpy as np
import numpy.ma as ma
from pickle import load, dump

"""
This is an example of calculating the joint probability distribution function of rainfall intensity and duration for the Northern Great Plains using GPM IMERG data for June/01/2015
""" 

""" Step 1: Load the GPM and WRF24 datasets with spatial filter """

GPM_dataset_filtered = local.load_GPM_IMERG_files_with_spatial_filter(
                           file_path='./data/GPM_2015_summer/', 
                           filename_pattern=['*2015*.HDF5'],
                           user_mask_file='Bukovsky_regions.nc',
                           mask_variable_name='Bukovsky',
                           user_mask_values=[10],
                           longitude_name='lon',
                           latitude_name='lat')

WRF_dataset = local.load_WRF_2d_files_RAIN(
                  file_path='./data/WRF24_2010_summer/', 
                  filename_pattern=['wrf2dout*'])

""" Step 2: Load the spatial filter (Bukovsky region mask) """

Bukovsky_mask = Bounds(boundary_type='user',
                       user_mask_file='Bukovsky_regions.nc',
                       mask_variable_name='Bukovsky',
                       longitude_name='lon',
                       latitude_name='lat')  

""" Step 3: Spatial subset the WRF data (for Northern Great Plains, user_mask_values=[10]) """

WRF_dataset_filtered = dsp.subset(WRF_dataset, 
                           Bukovsky_mask, user_mask_values=[10])

""" Step 4: Analyze the wet spells """
duration1, peak1, total1 = metrics.wet_spell_analysis(GPM_dataset_filtered, 
                               threshold=0.1, nyear=1, dt=0.5)
duration2, peak2, total2 = metrics.wet_spell_analysis(WRF_dataset_filtered.values, 
                               threshold=0.1, nyear=1, dt=0.5)

""" Step 5: Calculate the joint PDF(JPDF) of spell_duration and peak_rainfall """

histo2d_GPM = metrics.calc_joint_histogram(data_array1=duration1, data_array2=peak1, 
                   bins_for_data1=np.append(np.arange(25)+0.5,[48.5,120.5]),
                   bins_for_data2=[0.1,0.2,0.5,1.0,2.0,5.0,10,20,30]) 
histo2d_GPM = histo2d_GPM/np.sum(histo2d_GPM)*100.

histo2d_WRF = metrics.calc_joint_histogram(data_array1=duration2, data_array2=peak2, 
                   bins_for_data1=np.append(np.arange(25)+0.5,[48.5,120.5]),
                   bins_for_data2=[0.1,0.2,0.5,1.0,2.0,5.0,10,20,30]) 
histo2d_WRF = histo2d_WRF/np.sum(histo2d_WRF)*100.

""" Step 6: Visualize the JPDF """


plot_level = np.array([0., 0.01,0.05, 0.1, 0.2, 0.5,1,2,3,5,10,25])
plotter.draw_precipitation_JPDF(plot_data=np.transpose(histo2d_GPM), 
          plot_level=plot_level, title='', 
          x_ticks=[0.5, 4.5, 9.5, 14.5, 19.5, 23.5], x_names=['1','5','10','15','20','24'],
          y_ticks=np.arange(9), y_names=['0.1','0.2','0.5','1.0','2.0','5.0','10','20','30'], 
          output_file='GPM_JPDF_example')
plotter.draw_precipitation_JPDF(plot_data=np.transpose(histo2d_WRF), 
          plot_level=plot_level, title='', 
          x_ticks=[0.5, 4.5, 9.5, 14.5, 19.5, 23.5], x_names=['1','5','10','15','20','24'],
          y_ticks=np.arange(9), y_names=['0.1','0.2','0.5','1.0','2.0','5.0','10','20','30'], 
          output_file='WRF24_JPDF_example')

overlap = metrics.calc_histogram_overlap(histo2d_GPM, histo2d_WRF)
plot_level = np.array([-21, -3, -1, -0.5, -0.2, -0.1, -0.05, 0, 0.05, 0.1, 0.2, 0.5, 1, 3, 21])
cbar_ticks = [-2, -0.5, -0.1, 0.1, 0.5, 2]
cbar_label = [str(i) for i in cbar_ticks]
plotter.draw_precipitation_JPDF(plot_data=np.transpose(histo2d_WRF - histo2d_GPM), 
          plot_level=plot_level, title='overlap %d ' %overlap +r'%', diff_plot=True,
          x_ticks=[0.5, 4.5, 9.5, 14.5, 19.5, 23.5], x_names=['1','5','10','15','20','24'],
          y_ticks=np.arange(9), y_names=['0.1','0.2','0.5','1.0','2.0','5.0','10','20','30'],
          output_file='GPM_WRF24_JPDF_comparison',  
          cbar_ticks=cbar_ticks, cbar_label=cbar_label)

