import pytest
import importlib
import dash
from contextvars import copy_context
from dash._callback_context import context_value
from dash._utils import AttributeDict
code = importlib.import_module('tabs.observations_callbacks')


#============ TEST render_evaluation_tab=================================
def test_render_observations_tab():
    # CASE 1, RGB 1 CLICK, VISIBILITY NO CLICK
    def run_callback():
        context_value.set(AttributeDict(**{"triggered_inputs": [{"prop_id": "rgb.n_clicks"}, {"prop_id": "visibility.n_clicks"}]}))
        code.START_DATE = '20120120'
        code.END_DATE = '20220831'
        return code.render_observations_tab(1, 0) 

    ctx = copy_context()
    output = ctx.run(run_callback)
    assert "' All observations are kindly offered by Partners of the WMO Barcelona Dust Regional Center. RGB is a qualitative satellite product that indicates desert dust in the entire atmospheric column (represented by pink colour).']), className='description-body'), Div(children=[Button(children='HEMISPHERIC', id='btn-fulldisc', active=True), Button(children='MIDDLE EAST', id='btn-middleeast', active=False)], id='rgb-buttons'), Div(children=[Img(id='rgb-image', alt='EUMETSAT RGB - NOT AVAILABLE', src='./assets/eumetsat/FullDiscHD/archive/20220831/FRAME_OIS_RGB-dust-all_202208310000.gif'), Div(children=NavbarSimple(children=[Div(children=[Span(children=DatePickerSingle(date='20220831', min_date_allowed=datetime.datetime(2012, 1, 20, 0, 0), max_date_allowed=datetime.datetime(2022, 8, 31, 0, 0), placeholder='DD MON YYYY', initial_visible_month=datetime.datetime(2022, 8, 31, 0, 0), clearable=True, reopen_calendar_on_clear=True, display_format='DD MMM YYYY', id='obs-date-picker'), className='timesliderline'), Span(children=[Button(id='btn-obs-play', className='fa fa-play', n_clicks=0, title='Play')], className='timesliderline anim-buttons'), Span(children=Slider(min=0, max=23, step=1, marks={0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: '10', 11: '11', 12: '12', 13: '13', 14: '14', 15: '15', 16: '16', 17: '17', 18: '18', 19: '19', 20: '20', 21: '21', 22: '22', 23: '23'}, value=0, id='obs-slider-graph'), className='timesliderline')], className='timeslider')], id='rgb-navbar', className='fixed-bottom navbar-timebar', dark=True, expand='lg', fixed='bottom', fluid=True), className='layout-dropdown')], className='centered-image'), Div(Interval(id='obs-slider-interval', disabled=True, interval=1000, n_intervals=0))], id='observations-tab', className='horizontal-menu', label='Observations', value='observations-tab')" in str(output[0]) 
    assert output[1:] == ({ 'font-weight': 'bold' }, { 'font-weight': 'normal' }, 'rgb')


def test_render_observations_tab_visibility():
    # CASE 2, RGB NO CLICK, VISIBILITY 1 CLICK
    def run_callback():
        context_value.set(AttributeDict(**{"triggered_inputs": [{"prop_id": "visibility.n_clicks"}]}))
        code.START_DATE = '20120120'
        code.END_DATE = '20220831'
        return code.render_observations_tab(0, 1) 

    from utils import get_vis_edate
    from datetime import datetime
    hour = datetime.now().hour
    _, default_tstep = get_vis_edate('20220831', hour=hour)
    ctx = copy_context()
    output = ctx.run(run_callback)
    print("*********************")
    print(output[0])
    print(output[1:])
    print("*********************")
    assert "'All observations are kindly offered by Partners of the WMO Barcelona Dust Regional Center. The reduction of VISIBILITY is an indirect measure of the occurrence of sand and dust storms on the surface.']), className='description-body'), Div(children=[], id='obs-vis-graph', className='graph-with-slider'), Div(children=[NavbarSimple(children=[Div(children=[Span(children=DatePickerSingle(date='20220831', min_date_allowed=datetime.datetime(2012, 1, 20, 0, 0), max_date_allowed=datetime.datetime(2022, 8, 31, 0, 0), placeholder='DD MON YYYY', initial_visible_month=datetime.datetime(2022, 8, 31, 0, 0), clearable=True, reopen_calendar_on_clear=True, display_format='DD MMM YYYY', id='obs-vis-date-picker'), className='timesliderline'), None, Span(children=Slider(min=0, max=18, step=6, marks={0: {'label': '00-06'}, 6: {'label': '06-12'}, 12: {'label': '12-18'}, 18: {'label': '18-24', 'style': {'left': '', 'right': '-32px'}}}, value=%(default_tstep)s, id='obs-vis-slider-graph'), className='timesliderline')], className='timeslider')], id='rgb-navbar', className='fixed-bottom navbar-timebar', dark=True, expand='lg', fixed='bottom', fluid=True), Br(None), Br(None), Div(children=[Span(children=P('Dust data ©2023 WMO Barcelona Dust Regional Center.'), id='forecast-disclaimer')], className='disclaimer')], className='layout-dropdown rgb-layout-dropdown')], id='observations-tab', className='horizontal-menu', label='Observations', value='observations-tab')" % { 'default_tstep': default_tstep }in str(output[0]) 
    assert output[1:] == ({ 'font-weight': 'normal' }, { 'font-weight': 'bold' }, 'visibility')



#NEED TO MOCK FIRST RETURN OBJECT
# def test_update_image_src():
#     def run_callback():
#         context_value.set(AttributeDict(**{"triggered_inputs": [{"prop_id": "btn_fulldisc.n_clicks"},{"prop_id": "btn_middleeast.n_clicks"},{"prop_id": "obs-date-picker.date"},{"prop_id": "obs-slider-graph.value"},{"prop_id": "btn_fulldisc.active"},{"prop_id": "btn_middleeast.active"}]}))
#         return code.update_image_src.uncached(0, 0, '20220808', 0, True, False) 
#
#     ctx = copy_context()
#     output = ctx.run(run_callback)
#     assert output == (True, 3, 'fa fa-play text-center')
    
def test_start_stop_obs_autoslider_pause():
    def run_callback():
        context_value.set(AttributeDict(**{"triggered_inputs": [{"prop_id": "btn-obs-play.n_clicks"},{"prop_id": "slider-interval.disabled"},{"prop_id": "slider-graph.value"}]}))
        return code.start_stop_obs_autoslider.uncached(1, False, 3) 

    ctx = copy_context()
    output = ctx.run(run_callback)
    assert output == (True, 3, 'fa fa-play text-center')

def test_start_stop_obs_autoslider_play():
    def run_callback():
        context_value.set(AttributeDict(**{"triggered_inputs": [{"prop_id": "btn-obs-play.n_clicks"},{"prop_id": "slider-interval.disabled"},{"prop_id": "slider-graph.value"}]}))
        return code.start_stop_obs_autoslider.uncached(1, True, 9) 

    ctx = copy_context()
    output = ctx.run(run_callback)
    assert output == (False, 9, 'fa fa-pause text-center')

def test_update_obs_slider():
    assert code.update_obs_slider.uncached(1) == 1
    assert code.update_obs_slider.uncached(9) == 9
    assert code.update_obs_slider.uncached(25) == 1
    assert code.update_obs_slider.uncached(72) == 0
    assert code.update_obs_slider.uncached(56) == 8

def test_update_vis_figure():
    run = code.update_vis_figure.uncached('20220808', 1, [5], [45,45])
    assert "Map(children=[TileLayer(id={'tag': 'obs-vis-tile-layer', 'index': 'None'}" in str(run)

    assert "id='vis-info', className='info', style={'position': 'absolute', 'top': '10px', 'left': '10px', 'zIndex': '1000', 'fontFamily'" in str(run)
                                                    
def test_update_vis_figure_date_none():
    run = code.update_vis_figure.uncached(None, 1, [5], [45,45])
    assert "id={'tag': 'obs-vis-map', 'index': 'None'}, animate=False, center=45, inertia=True, minZoom=2, preferCanvas=True, wheelDebounceTime=80, wheelPxPerZoomLevel=120, zoom=5, zoomSnap=0.1)" in str(run)


                                                
