from collections import OrderedDict

from extreme_data.meteo_france_data.scm_models_data.utils import SeasonForTheMaxima
from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \
    TemporalMarginFitMethod
from extreme_trend.visualizers.study_visualizer_for_non_stationary_trends import \
    StudyVisualizerForNonStationaryTrends


def load_altitude_to_visualizer(altitudes, massif_names, model_subsets_for_uncertainty, study_class,
                                uncertainty_methods,
                                study_visualizer_class=StudyVisualizerForNonStationaryTrends,
                                save_to_file=True,
                                multiprocessing=True,
                                season=SeasonForTheMaxima.annual):
    fit_method = TemporalMarginFitMethod.extremes_fevd_mle
    altitude_to_visualizer = OrderedDict()
    for altitude in altitudes:
        study = study_class(altitude=altitude, multiprocessing=multiprocessing, season=season)
        study_visualizer = study_visualizer_class(study=study, multiprocessing=multiprocessing,
                                                  save_to_file=save_to_file, uncertainty_massif_names=massif_names,
                                                  uncertainty_methods=uncertainty_methods,
                                                  model_subsets_for_uncertainty=model_subsets_for_uncertainty,
                                                  fit_method=fit_method, select_only_acceptable_shape_parameter=True,
                                                  fit_gev_only_on_non_null_maxima=False,
                                                  fit_only_time_series_with_ninety_percent_of_non_null_values=True)
        altitude_to_visualizer[altitude] = study_visualizer

    return altitude_to_visualizer