Invalid number of output values for ..my-graph.figure…download.href… Expected 2, got 3

I am trying to add a download button to dash which enables end user to download the plot as html. Before the implementation of this button and its relevant callbacks, there were no errors here, I just had one output with multiple inputs, but for the download button to work, I guess I need to provide another output, and now with the Input being the element of a list along with the Output, is it the case of a callback having multiple inputs and outputs? Maybe my approch to add this functional button is wrong?

@app.callback(Output(component_id='my-graph', component_property='figure'),
          Output(component_id='download', component_property='href'),
          [Input(component_id='release_choice', component_property='value'),
           Input(component_id='Tech_choice', component_property='value'),
           Input(component_id='date_choice', component_property='start_date'),
           Input(component_id='date_choice', component_property='end_date')], )

Here is the code-

import dash
import datetime as datetime
import plotly.express as px
import pandas as pd
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Output, Input
from base64 import b64encode
import io
df = pd.DataFrame(
    {'Unnamed: 0': {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},
     'Technology': {0: '4G', 1: '4G', 2: 'SM', 3: '5G', 4: 'SM', 5: '4G', 6: 'SM', 7: '5G', 8: '2G', 9: 'SM', 10: '5G',
                    11: 'SM', 12: 'SM', 13: '4G'},
     'SystemRelease': {0: 'lte22', 1: 'lte22', 2: 'umts22', 3: '5G22', 4: 'umts22A', 5: 'lte18A', 6: 'umts6A',
                       7: '5G22A', 8: '2G18', 9: 'L22B', 10: '5G22A', 11: 'umts22B', 12: 'L22A', 13: 'lte18A'},
     'Date': {0: '27.09.2022', 1: '26.09.2022', 2: '25.09.2022', 3: '25.09.2022', 4: '24.09.2022', 5: '23.09.2022',
              6: '23.09.2022', 7: '23.09.2022', 8: '20.09.2022', 9: '22.09.2022', 10: '22.09.2022', 11: '22.09.2022',
              12: '22.09.2022', 13: '22.09.2022'},
     'TypeofRelease': {0: 'Normal Update', 1: 'Standard Update', 2: 'Standard Update', 3: 'Maintenance Delivery',
                       4: 'Delivery', 5: 'Standard Update', 6: 'Normal Update', 7: 'Delivery', 8: 'Standard Update',
                       9: 'Delivery', 10: 'Delivery', 11: 'Delivery', 12: 'Delivery', 13: 'Standard Update'},
     'Package': {0: '2.5', 1: '0.3', 2: '0.3', 3: '1.1.2', 4: '1.0', 5: '3.0.7', 6: '01.03.2007', 7: '0.2', 8: '2.3',
                 9: '1.0', 10: '0.5', 11: '1.0', 12: '1.0.6', 13: '6.0'}})

df['date2'] = [datetime.datetime.strptime(x, '%d.%m.%Y') for x in df['Date']]
df.sort_values(by=['date2'], inplace=True)

app = dash.Dash(__name__)
app.title = "Roadmap"

app.layout = html.Div(
    children=[
        html.Div(
            children=[
                html.Div(
                    children=[
                        html.Div(children='Select Technology:', className="menu-title"),
                        dcc.Dropdown(
                            id='Tech_choice',
                            options=[{'label': x, 'value': x}
                                     for x in df.Technology.unique()],
                            value='4G',
                            clearable=False,
                            className="dropdown",
                        ), ]),
                html.Div(
                    children=[
                        html.Div(children="Select Release:", className="menu-title"),
                        dcc.Dropdown(
                            id='release_choice',
                            options=[],
                            clearable=False,
                            className="dropdown",
                        )
                    ]
                ),
                html.Div(
                    children=[
                        html.Div(children="Select Date:", className="menu-title"),
                        dcc.DatePickerRange(
                            id="date_choice",
                            min_date_allowed=df.date2.min().date(),
                            max_date_allowed=df.date2.max().date(),
                            start_date=df.date2.min().date(),
                            end_date=df.date2.max().date(),
                        )
                    ]
                ),
                html.A(
                    html.Button("Download HTML"),
                    id="download",
                    href="",
                    download="plotly_graph.html"
                )
            ],
            className="menu",
        ),
        html.Div(
            children=[
                html.Div(
                    children=dcc.Graph(
                        id='my-graph', config={"displayModeBar": False}
                        # style={'overflowY': 'scroll', 'width': 1000}
                    ),
                    className="card",
                ),
            ],
            className="wrapper",
        ),
    ])

# @app.callback(Output('download', 'href'),
#               [Input]) #?



@app.callback(
    Output(component_id='release_choice', component_property='options'),
    [Input(component_id='Tech_choice', component_property='value')])
def get_options(Tech_choice):
    dff = df[df.Technology == Tech_choice]
    return [{'label': i, 'value': i} for i in dff['SystemRelease'].unique()]


@app.callback(
    Output(component_id='release_choice', component_property='value'),
    [Input(component_id='release_choice', component_property='options')])
def get_values(release_choice):
    return [k['value'] for k in release_choice][0]


@app.callback(
    [Output(component_id='date_choice', component_property='start_date'),
     Output(component_id='date_choice', component_property='end_date')],
    [Input(component_id='release_choice', component_property='value')])
def get_options(date_choice):
    dff = df[df.date2 == date_choice] 
    return [{'label': i, 'value': i} for i in dff['date2']]


@app.callback(Output(component_id='my-graph', component_property='figure'),
              Output(component_id='download', component_property='href'),
              [Input(component_id='release_choice', component_property='value'),
               Input(component_id='Tech_choice', component_property='value'),
               Input(component_id='date_choice', component_property='start_date'),
               Input(component_id='date_choice', component_property='end_date')], )
def int_gr(release_choice, Tech_choice, start_date, end_date):
    print(Tech_choice)
    print(release_choice)
    dff = df[
        (df['SystemRelease'] == release_choice) & (df['Technology'] == Tech_choice) & (df['date2'] >= start_date) & (
                    df['date2'] <= end_date)]
    fig = px.scatter(data_frame=dff, x='date2', y='SystemRelease', color="TypeofRelease", text='Package',
                     labels={
                         "SystemRelease": "System Release",
                         "date2": "Date",
                         "TypeofRelease": "Type of Release:"
                     })
    fig.update_traces(marker=dict(size=12,
                                  line=dict(width=2,
                                            color='DarkSlateGrey')),

                      selector=dict(mode='markers'))
    # fig.update_traces(boxpoints='all', jitter=0.8)
    fig.update_traces(textposition='top center', mode='markers+text')
    fig.update_layout(
        autosize=False,
        width=1200,
        height=400)
    fig.write_html(r'test.html', include_plotlyjs="cdn", full_html='False')
    buffer = io.StringIO()
    fig.write_html(buffer)
    html_bytes = buffer.getvalue().encode()
    encoded = b64encode(html_bytes).decode()

    return fig, '', "data:text/html;base64," + encoded


if __name__ == '__main__':
    app.run_server()