from pathlib import Path


def setup_notes_path(notes: Path) -> None:
    # TODO reuse doc from my.cfg?
    from my.cfg import config

    class user_config:
        paths = [notes]
    config.orgmode = user_config # type: ignore[misc,assignment]
    # TODO  ugh. this belongs to tz provider or global config or someting
    import pytz
    class user_config_2:
        default_timezone = pytz.timezone('Europe/London')
    config.weight  = user_config_2 # type: ignore[misc,assignment]


def test_dynamic_configuration(notes: Path) -> None:
    setup_notes_path(notes)

    from my.body.weight import dataframe
    weight_df = dataframe()

    assert list(weight_df['weight'].fillna(0.0)) == [
        0.0,
        62.0,
        0.0,
        61.0,
        62.0,
        0.0,
    ]

import pytest # type: ignore


# TODO doublt I need it anymore.. keeping for now just for the sake of demonstration
def _test_set_repo(tmp_path: Path) -> None:
    from my.cfg import config
    class user_config:
        export_path = 'whatever',
    config.hypothesis = user_config # type: ignore[misc,assignment]

    # precondition:
    # should fail because can't find hypexport
    with pytest.raises(ModuleNotFoundError):
        import my.hypothesis

    fake_hypexport = tmp_path / 'hypexport'
    fake_hypexport.mkdir()
    (fake_hypexport / 'dal.py').write_text('''
Highlight = None
Page = None
DAL = None
    ''')

    from my.cfg import set_repo
    set_repo('hypexport', fake_hypexport)

    # should succeed now!
    import my.hypothesis


def test_environment_variable(tmp_path: Path) -> None:
    cfg_dir  = tmp_path / 'my'
    cfg_file = cfg_dir / 'config.py'
    cfg_dir.mkdir()
    cfg_file.write_text('''
class feedly:
    pass
''')

    import os
    os.environ['MY_CONFIG'] = str(tmp_path)

    # should not raise at least
    import my.rss.feedly


@pytest.fixture
def notes(tmp_path: Path):
    ndir = tmp_path / 'notes'
    ndir.mkdir()
    logs = ndir / 'logs.org'
    logs.write_text('''
#+TITLE: Stuff I'm logging

* Weight (org-capture) :weight:
** [2020-05-01 Fri 09:00] 62
** 63
    this should be ignored, got no timestamp
** [2020-05-03 Sun 08:00] 61
** [2020-05-04 Mon 10:00] 62
    ''')
    misc = ndir / 'misc.org'
    misc.write_text('''
Some misc stuff

* unrelated note :weight:whatever:
    ''')
    try:
        yield ndir
    finally:
        pass


@pytest.fixture(autouse=True)
def reset_config():
    # otherwise tests impact each other because of the cached my. modules...
    # hacky, but does the trick?
    import sys
    import re
    to_unload = [m for m in sys.modules if re.match(r'my[.]?', m)]
    for m in to_unload:
        del sys.modules[m]
    yield
