from pathlib import Path
import tempfile
import pickle

import pytest
from scipy import stats

from locan.analysis.analysis_base import _Analysis, _list_parameters
from locan.analysis import metadata_analysis_pb2


def test_Analysis():
    ae = _Analysis(limits=(100, 110), meta={'comment': 'this is an example'})
    # print(repr(ae))
    assert str(ae) == repr(ae)
    assert ae.parameter == {'limits': (100, 110)}

    #print(ae.meta)
    #print(dir(metadata_analysis_pb2))
    assert isinstance(ae.meta, metadata_analysis_pb2.AMetadata)
    assert ae.meta.identifier
    assert ae.meta.creation_time
    assert ae.meta.method.name == "_Analysis"
    assert ae.meta.comment == 'this is an example'

    ae.meta.comment = 'new comment'
    assert ae.meta.comment == 'new comment'

    ae.meta.map['variable key'] = 'value_1'
    assert str(ae.meta.map) == "{'variable key': 'value_1'}"

    ae.meta.map['key_2'] = 'value_2'
    assert ae.meta.map['key_2'] == 'value_2'

    with pytest.raises(NotImplementedError):
        ae.compute()


def test_pickling_Analysis():
    ae = _Analysis(limits=(100, 110), meta={'comment': 'this is an example'})
    with tempfile.TemporaryDirectory() as tmp_directory:
        file_path = Path(tmp_directory) / 'pickled_analysis.pickle'
        with open(file_path, 'wb') as file:
            pickle.dump(ae, file, pickle.HIGHEST_PROTOCOL)
        with open(file_path, 'rb') as file:
            ae_pickled = pickle.load(file)
        assert ae_pickled.parameter == ae.parameter
        assert isinstance(ae_pickled.meta, metadata_analysis_pb2.AMetadata)
        assert ae_pickled.meta == ae.meta


def test__list_parameters():
    with pytest.raises(AttributeError):
        parameters = _list_parameters('fail')
    parameters = _list_parameters('expon')
    assert parameters == ['loc', 'scale']
    parameters = _list_parameters(stats.gamma)
    assert parameters == ['a', 'loc', 'scale']
    parameters = _list_parameters(stats.poisson)
    assert parameters == ['mu', 'loc']
