from pathlib import Path
from symconf import ConfigManager


config_dir = Path(
    __file__, '..', 'test-config-dir/'
).resolve()
cm = ConfigManager(config_dir)

def test_config_map():
    file_map = cm.app_config_map('test')
    
    # from user
    assert 'none-none.aaa'    in file_map
    assert 'none-light.aaa'  in file_map
    assert 'test-dark.bbb'  in file_map
    assert 'test-light.ccc' in file_map

    # from generated
    assert 'test-none.aaa' in file_map

def test_matching_configs_exact():
    '''
    Test matching exact palette and scheme. Given strict mode not set (allowing relaxation
    to "none"), the order of matching should be

    1. (none, none)      :: none-none.aaa
    2. (none, scheme)    :: none-light.aaa
    3. (palette, none)   :: test-none.aaa & test-none.ddd
    4. (palette, scheme) :: test-light.ccc

    Yielding "test-none.aaa", "test-light.ccc", "test-none.ddd" (unique only on path name).
    '''
    any_light = cm.get_matching_configs(
        'test', 
        palette='test',
        scheme='light',
    )

    assert len(any_light) == 3 
    assert any_light['aaa'].name == 'test-none.aaa'
    assert any_light['ccc'].name == 'test-light.ccc'
    assert any_light['ddd'].name == 'test-none.ddd'

def test_matching_configs_any_palette():
    '''
    Test matching exact palette and scheme. Given strict mode not set (allowing relaxation
    to "none"), the order of matching should be

    1. (palette, none)   :: test-none.aaa & test-none.ddd & none-none.aaa
    2. (none, none)      :: none-none.aaa
    3. (palette, scheme) :: test-dark.bbb
    4. (none, scheme)    :: (nothing)

    Yielding "none-none.aaa" (should always overwrite "test-none.aaa" due to "any"'s
    preference for non-specific matches, i.e., "none"s), "test-none.ddd", "test-dark.bbb"
    (unique only on path name).
    '''
    any_dark = cm.get_matching_configs(
        'test', 
        palette='any',
        scheme='dark',
    )

    assert len(any_dark) == 3 
    assert any_dark['aaa'].name == 'none-none.aaa'
    assert any_dark['bbb'].name == 'test-dark.bbb'
    assert any_dark['ddd'].name == 'test-none.ddd'

def test_matching_configs_any_scheme():
    '''
    Test matching exact palette and scheme. Given strict mode not set (allowing relaxation
    to "none"), the order of matching should be

    1. (none, scheme)    :: none-light.aaa & none-none.aaa
    2. (none, none)      :: none-none.aaa
    3. (palette, scheme) :: test-dark.bbb & test-light.ccc & test-none.aaa & test-none.ddd
    4. (palette, none)   :: test-none.aaa & test-none.ddd

    Yielding "test-none.aaa", "test-none.ddd", "test-light.ccc", "test-dark.bbb"
    '''
    test_any = cm.get_matching_configs(
        'test', 
        palette='test',
        scheme='any',
    )

    assert len(test_any) == 4
    assert test_any['aaa'].name == 'test-none.aaa'
    assert test_any['bbb'].name == 'test-dark.bbb'
    assert test_any['ccc'].name == 'test-light.ccc'
    assert test_any['ddd'].name == 'test-none.ddd'

def test_matching_scripts():
    '''
    Test matching exact palette and scheme. Given strict mode not set (allowing relaxation
    to "none"), the order of matching should be

    1. (none, none)      :: none-none.sh
    2. (none, scheme)    :: none-light.sh
    3. (palette, none)   :: test-none.sh
    4. (palette, scheme) :: (nothing)

    Yielding (ordered by dec specificity) "test-none.sh" as primary match, then relaxation
    match "none-none.sh".
    '''
    test_any = cm.get_matching_scripts(
        'test', 
        palette='test',
        scheme='any',
    )

    assert len(test_any) == 2
    assert list(map(lambda p:p.name, test_any)) == ['test-none.sh', 'none-none.sh']

    any_light = cm.get_matching_scripts(
        'test', 
        palette='any',
        scheme='light',
    )

    assert len(any_light) == 2
    assert list(map(lambda p:p.name, any_light)) == ['none-light.sh', 'none-none.sh']

    any_dark = cm.get_matching_scripts(
        'test', 
        palette='any',
        scheme='dark',
    )

    assert len(any_dark) == 2
    assert list(map(lambda p:p.name, any_dark)) == ['test-none.sh', 'none-none.sh']