#!/usr/bin/env python

# This file is part of chelsa_isimip3b_ba_1km.
#
# chelsa_isimip3b_ba_1km is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# chelsa_isimip3b_ba_1km is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with chelsa_isimip3b_ba_1km.  If not, see <https://www.gnu.org/licenses/>.

import os
from . import saga_functions
saga_functions.Load_Tool_Libraries(True)

# change this that it accepts lat long


class Coarse_data:
    ''' coarse grid data '''

    def __init__(self, TEMP):
        self.isimip3b_tas = None
        self.isimip3b_tasmax = None
        self.isimip3b_tasmin = None
        self.isimip3b_pr = None
        self.isimip3b_rsds = None
        self.cmip6_uas = None
        self.cmip6_vas = None
        self.cmip6_lcl = None
        self.cmip6_clt = None
        self.cmip6_tlapse = None
        self.TEMP = TEMP

    def set(self, var):
        if getattr(self, var) is None:
            return self._build_(var)

    def delete(self, var):
        saga_functions.saga_api.SG_Get_Data_Manager().Delete(getattr(self, var))
        setattr(self, var, None)

    def _delete_grid_list_(self, list):
        for m in range(0, list.Get_Item_Count()+1):
            print('delete grid no:' + str(m))
            saga_functions.saga_api.SG_Get_Data_Manager().Delete(list.Get_Grid(m))
            list.Del_Items()

    def _build_(self, var):
        ds = saga_functions.import_ncdf(os.path.join(self.TEMP, var + '.nc')).Get_Grid(0)
        if var == 'isimip3b_rsds':
            ds = saga_functions.grid_calculator_simple(ds, 'a/0.01157408333')
        elif var == 'cmip6_clt':
            ds = saga_functions.grid_calculator_simple(ds, 'a*0.01')
        setattr(self, var, ds)


class Dem_data:
    ''' elevational grid data '''

    def __init__(self, INPUT):
        self.demproj = None  # saga_functions.load_sagadata(INPUT + 'dem_merc3.sgrd')
        self.dem_latlong3 = None  # saga_functions.load_sagadata(INPUT + 'dem_latlong3.sgrd')
        self.dem_low = None  # saga_functions.load_sagadata(INPUT + 'orography.sgrd')
        self.dem_high = None  # saga_functions.load_sagadata(INPUT + 'dem_latlong.sgrd')
        self.INPUT = INPUT

    def set(self, var):
        if getattr(self, var) is None:
            return self._build_(var)

    def delete(self, var):
        saga_functions.saga_api.SG_Get_Data_Manager().Delete(getattr(self, var))
        setattr(self, var, None)

    def _delete_grid_list_(self, list):
        for m in range(0, list.Get_Item_Count()+1):
            print('delete grid no:' + str(m))
            saga_functions.saga_api.SG_Get_Data_Manager().Delete(list.Get_Grid(m))
            list.Del_Items()

    def _build_(self, var):
        if var == 'demproj':
            ds = saga_functions.load_sagadata(os.path.join(self.INPUT, 'dem_merc3.sgrd'))
            setattr(self, var, ds)

        if var == 'dem_latlong3':
            ds = saga_functions.load_sagadata(os.path.join(self.INPUT, 'dem_latlong3.sgrd'))
            setattr(self, var, ds)

        if var == 'dem_low':
            ds = saga_functions.load_sagadata(os.path.join(self.INPUT, 'orography.sgrd'))
            ds = saga_functions.change_data_storage(ds)
            ds = saga_functions.change_latlong(ds)
            setattr(self, var, ds)

        if var == 'dem_high':
            ds = saga_functions.load_sagadata(os.path.join(self.INPUT, 'dem_latlong.sgrd'))
            ds = saga_functions.change_data_storage(ds)
            setattr(self, var, ds)


class Aux_data:
    ''' Auxillary grid data '''

    def __init__(self, INPUT, W5E5):
        self.patch = None  # saga_functions.load_sagadata(os.path.join(INPUT, 'patch.sgrd'))
        self.expocor = None  # saga_functions.load_sagadata(os.path.join(INPUT, 'expocor.sgrd'))
        self.dummy_W5E5 = None  # saga_functions.load_sagadata(os.path.join(INPUT, 'dummy_W5E5.sgrd'))
        self.template_025 = None  # saga_functions.load_sagadata(os.path.join(W5E5, 'template_025.sgrd'))
        self.template_010 = None  # saga_functions.load_sagadata(os.path.join(W5E5, 'template_010.sgrd'))
        self.oceans = None  # saga_functions.load_sagadata(os.path.join(W5E5, 'oceans.sgrd'))
        self.continents = None  # saga_functions.load_sagadata(os.path.join(W5E5, 'continents.sgrd'))
        self.landseamask = None  # saga_functions.load_sagadata(os.path.join(W5E5, 'landseamask.sgrd'))
        self.INPUT = INPUT
        self.W5E5 = W5E5

    def set(self, var):
        if getattr(self, var) is None:
            return self._build_(var)

    def _build_(self, var):
        if var == 'patch' or var == 'expocor' or var == 'dummy_W5E5':
            ds = saga_functions.load_sagadata(os.path.join(self.INPUT, var + '.sgrd'))
            setattr(self, var, ds)
        else:
            ds = saga_functions.load_sagadata(os.path.join(self.W5E5, var + '.sgrd'))
            setattr(self, var, ds)
            
    def delete(self, var):
        saga_functions.saga_api.SG_Get_Data_Manager().Delete(getattr(self, var))
        setattr(self, var, None)


class Srad_data:
    ''' Radiation class '''

    def __init__(self, SRAD, dayofyear):
        self.rsds_clim = None  # import_gdal(os.path.join(SRAD, 'CHELSA_stot_pj_' + dayofyear + '_V.2.1.tif'))
        self.SRAD = SRAD
        self.dayofyear = dayofyear

    def set(self, var):
        if getattr(self, var) is None:
            return self._build_(var)

    def delete(self, var):
        saga_functions.saga_api.SG_Get_Data_Manager().Delete(getattr(self, var))
        setattr(self, var, None)

    def _build_(self, var):
        ds = saga_functions.import_gdal(os.path.join(self.SRAD, 'CHELSA_stot_pj_' + self.dayofyear + '_V.2.1.tif'))
        setattr(self, var, ds)
