from dash.dependencies import Input, Output, State, ClientsideFunction, ALL

def callbacks(app):
    """
    We define all clientside callbacks that handle:
      1) Scrolling
      2) Camera modal toggling (open/close)
      3) Camera initialization (live preview)
      4) Frame capture => base64 => stored in 'camera-output'
    """

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToTextarea'
        ),
        Output('js', 'children', allow_duplicate=True),
        [
            Input('quickstart-speak', 'n_clicks'),
            Input('quickstart-speak-gb', 'n_clicks'),
            Input('quickstart-correct', 'n_clicks'),
            Input('quickstart-simplify', 'n_clicks'),
            Input('quickstart-elevate', 'n_clicks'),
            Input('quickstart-describe', 'n_clicks'),
            Input('quickstart-argue', 'n_clicks'),
            Input('quickstart-narrate', 'n_clicks'),
            Input('quickstart-recontext', 'n_clicks'),
            Input('quickstart-reimagine', 'n_clicks'),
            Input('quickstart-reinvent', 'n_clicks'),
        ],
        prevent_initial_call=True
    )
      
    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToGoogleTrans'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('quickstart-trans', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToGptTrans'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('quickstart-trans-gpt', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToQuiz'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('quickstart-quiz', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToStudy'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('quickstart-study', 'n_clicks')],
        prevent_initial_call=True
    )
    
    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToIllus'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('quickstart-draw', 'n_clicks')],
        prevent_initial_call=True
    )
    
    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToSuneung'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('suneung1', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToFileContent'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input({'type': 'file-button', 'index': ALL}, 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='copyToClipboard1'
        ),
        Output('js', 'children', allow_duplicate=True),
        Input('copy-suneung-set-output', 'n_clicks')
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='copyToClipboard2'
        ),
        Output('js', 'children', allow_duplicate=True),
        Input('copy-content', 'n_clicks')
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToTop'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('scroll-button', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToKoreanTutor'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('korean-tutor', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToAmericanTutor'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('us-tutor', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToSuneung'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('scroll-to-suneung-button', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToExercise'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('scroll-to-exercise-button', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToTutor'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('scroll-to-tutor-button', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToQuickstart'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('sidebar-quickstart', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToSuneungSet'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('sidebar-suneung', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToExercise'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('sidebar-exercise', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='clientside',
            function_name='scrollToTutor'
        ),
        Output('js', 'children', allow_duplicate=True),
        [Input('sidebar-tutor', 'n_clicks')],
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='camera',
            function_name='toggleModal'
        ),
        Output('camera-modal', 'is_open'),
        [
            Input('open-camera-modal-button','n_clicks'),
            Input('camera-modal-ok','n_clicks'),
            Input('camera-modal-cancel','n_clicks'),
        ],
        State('camera-modal', 'is_open'),
        prevent_initial_call=True
    )
    app.clientside_callback(
        ClientsideFunction(
            namespace='camera',
            function_name='initModalCamera'
        ),
        Output('camera-output', 'children', allow_duplicate=True),
        Input('camera-modal','is_open'),
        prevent_initial_call=True
    )

    app.clientside_callback(
        ClientsideFunction(
            namespace='camera',
            function_name='captureModalFrame'
        ),
        Output('camera-output','children', allow_duplicate=True),
        Input('camera-modal-ok','n_clicks'),
        prevent_initial_call=True
    )
