# coding: utf-8
import autopath
#from py.test import raises

from tiramisu.config import Config
from tiramisu.option import BoolOption, OptionDescription
from tiramisu.setting import owners
from tiramisu.storage import list_sessions, delete_session


def test_non_persistent():
    b = BoolOption('b', '')
    o = OptionDescription('od', '', [b])
    Config(o, session_id='test_non_persistent')


def test_list():
    b = BoolOption('b', '')
    o = OptionDescription('od', '', [b])
    c = Config(o, session_id='test_non_persistent')
    c.cfgimpl_get_settings().remove('cache')
    assert 'test_non_persistent' in list_sessions()
    del(c)
    assert 'test_non_persistent' not in list_sessions()


def test_create_persistent():
    b = BoolOption('b', '')
    o = OptionDescription('od', '', [b])
    try:
        Config(o, session_id='test_persistent', persistent=True)
    except ValueError:
        # storage is not persistent
        pass


def test_list_sessions_persistent():
    b = BoolOption('b', '')
    o = OptionDescription('od', '', [b])
    try:
        Config(o, session_id='test_persistent', persistent=True)
    except ValueError:
        # storage is not persistent
        pass
    else:
        assert 'test_persistent' in list_sessions()


def test_delete_session_persistent():
    b = BoolOption('b', '')
    o = OptionDescription('od', '', [b])
    try:
        Config(o, session_id='test_persistent', persistent=True)
    except ValueError:
        # storage is not persistent
        pass
    else:
        assert 'test_persistent' in list_sessions()
        delete_session('test_persistent')
        assert 'test_persistent' not in list_sessions()


def test_create_persistent_retrieve():
    b = BoolOption('b', '')
    o = OptionDescription('od', '', [b])
    try:
        c = Config(o, session_id='test_persistent', persistent=True)
        c.cfgimpl_get_settings().remove('cache')
    except ValueError:
        # storage is not persistent
        pass
    else:
        assert c.b is None
        c.b = True
        assert c.b is True
        del(c)
        c = Config(o, session_id='test_persistent', persistent=True)
        c.cfgimpl_get_settings().remove('cache')
        assert c.b is True
        assert 'test_persistent' in list_sessions()
        delete_session('test_persistent')
        c = Config(o, session_id='test_persistent', persistent=True)
        c.cfgimpl_get_settings().remove('cache')
        assert c.b is None
        delete_session('test_persistent')


def test_two_persistent():
    b = BoolOption('b', '')
    o = OptionDescription('od', '', [b])
    try:
        c = Config(o, session_id='test_persistent', persistent=True)
        c.cfgimpl_get_settings().remove('cache')
    except ValueError:
        # storage is not persistent
        pass
    else:
        c2 = Config(o, session_id='test_persistent', persistent=True)
        c2.cfgimpl_get_settings().remove('cache')
        assert c.b is None
        assert c2.b is None
        c.b = False
        assert c.b is False
        assert c2.b is False
        c.b = True
        assert c.b is True
        assert c2.b is True
        delete_session('test_persistent')


def test_two_persistent_owner():
    b = BoolOption('b', '')
    o = OptionDescription('od', '', [b])
    try:
        c = Config(o, session_id='test_persistent', persistent=True)
        c.cfgimpl_get_settings().remove('cache')
    except ValueError:
        # storage is not persistent
        pass
    else:
        c2 = Config(o, session_id='test_persistent', persistent=True)
        c2.cfgimpl_get_settings().remove('cache')
        owners.addowner('persistent')
        assert c.getowner(b) == owners.default
        assert c2.getowner(b) == owners.default
        c.b = False
        assert c.getowner(b) == owners.user
        assert c2.getowner(b) == owners.user
        c.cfgimpl_get_values().setowner(b, owners.persistent)
        assert c.getowner(b) == owners.persistent
        assert c2.getowner(b) == owners.persistent
        delete_session('test_persistent')


def test_two_persistent_information():
    b = BoolOption('b', '')
    o = OptionDescription('od', '', [b])
    try:
        c = Config(o, session_id='test_persistent', persistent=True)
        c.cfgimpl_get_settings().remove('cache')
    except ValueError:
        # storage is not persistent
        pass
    else:
        c.impl_set_information('info', 'string')
        assert c.impl_get_information('info') == 'string'
        c2 = Config(o, session_id='test_persistent', persistent=True)
        c2.cfgimpl_get_settings().remove('cache')
        c2.cfgimpl_get_settings().remove('cache')
        assert c2.impl_get_information('info') == 'string'
        delete_session('test_persistent')