# -*- coding: utf-8 -*-

import pytest

from vdirsyncer.cli.discover import expand_collections


missing = object()


@pytest.mark.parametrize('shortcuts,expected', [
    (['from a'], [
        ('c1', ({'type': 'fooboo', 'custom_arg': 'a1', 'collection': 'c1'},
                {'type': 'fooboo', 'custom_arg': 'b1', 'collection': 'c1'})),
        ('c2', ({'type': 'fooboo', 'custom_arg': 'a2', 'collection': 'c2'},
                {'type': 'fooboo', 'custom_arg': 'b2', 'collection': 'c2'})),
        ('a3', ({'type': 'fooboo', 'custom_arg': 'a3', 'collection': 'a3'},
                missing))
    ]),
    (['from b'], [
        ('c1', ({'type': 'fooboo', 'custom_arg': 'a1', 'collection': 'c1'},
                {'type': 'fooboo', 'custom_arg': 'b1', 'collection': 'c1'})),
        ('c2', ({'type': 'fooboo', 'custom_arg': 'a2', 'collection': 'c2'},
                {'type': 'fooboo', 'custom_arg': 'b2', 'collection': 'c2'})),
        ('b3', (missing,
                {'type': 'fooboo', 'custom_arg': 'b3', 'collection': 'b3'}))
    ]),
    (['from a', 'from b'], [
        ('c1', ({'type': 'fooboo', 'custom_arg': 'a1', 'collection': 'c1'},
                {'type': 'fooboo', 'custom_arg': 'b1', 'collection': 'c1'})),
        ('c2', ({'type': 'fooboo', 'custom_arg': 'a2', 'collection': 'c2'},
                {'type': 'fooboo', 'custom_arg': 'b2', 'collection': 'c2'})),
        ('a3', ({'type': 'fooboo', 'custom_arg': 'a3', 'collection': 'a3'},
                missing)),
        ('b3', (missing,
                {'type': 'fooboo', 'custom_arg': 'b3', 'collection': 'b3'}))
    ]),
    ([['c12', 'c1', 'c2']], [
        ('c12', ({'type': 'fooboo', 'custom_arg': 'a1', 'collection': 'c1'},
                 {'type': 'fooboo', 'custom_arg': 'b2', 'collection': 'c2'})),
    ]),
    (None, [
        (None, ({'type': 'fooboo', 'storage_side': 'a', 'collection': None},
                {'type': 'fooboo', 'storage_side': 'b', 'collection': None}))
    ]),
    ([None], [
        (None, ({'type': 'fooboo', 'storage_side': 'a', 'collection': None},
                {'type': 'fooboo', 'storage_side': 'b', 'collection': None}))
    ]),
])
def test_expand_collections(shortcuts, expected):
    config_a = {
        'type': 'fooboo',
        'storage_side': 'a'
    }

    config_b = {
        'type': 'fooboo',
        'storage_side': 'b'
    }

    def get_discovered_a():
        return {
            'c1': {'type': 'fooboo', 'custom_arg': 'a1', 'collection': 'c1'},
            'c2': {'type': 'fooboo', 'custom_arg': 'a2', 'collection': 'c2'},
            'a3': {'type': 'fooboo', 'custom_arg': 'a3', 'collection': 'a3'}
        }

    def get_discovered_b():
        return {
            'c1': {'type': 'fooboo', 'custom_arg': 'b1', 'collection': 'c1'},
            'c2': {'type': 'fooboo', 'custom_arg': 'b2', 'collection': 'c2'},
            'b3': {'type': 'fooboo', 'custom_arg': 'b3', 'collection': 'b3'}
        }

    assert sorted(expand_collections(
        shortcuts,
        config_a, config_b,
        get_discovered_a, get_discovered_b,
        lambda config, collection: missing
    )) == sorted(expected)
