# encoding: utf-8

from textwrap import dedent

import pytest


@pytest.fixture
def storage(tmpdir, runner):
    runner.write_with_general(dedent('''
    [storage foo]
    type = "filesystem"
    path = "{base}/foo/"
    fileext = ".txt"
    ''').format(base=str(tmpdir)))

    return tmpdir.mkdir('foo')


@pytest.mark.parametrize('collection', [None, "foocoll"])
def test_basic(storage, runner, collection):
    if collection is not None:
        storage = storage.mkdir(collection)
        collection_arg = 'foo/{}'.format(collection)
    else:
        collection_arg = 'foo'

    argv = ['repair', collection_arg]

    result = runner.invoke(argv, input='y')
    assert not result.exception

    storage.join('item.txt').write('BEGIN:VCARD\nEND:VCARD')
    storage.join('toobroken.txt').write('')

    result = runner.invoke(argv, input='y')
    assert not result.exception
    assert 'No UID' in result.output
    assert '\'toobroken.txt\' is malformed beyond repair' \
        in result.output
    new_fname, = [x for x in storage.listdir() if 'toobroken' not in str(x)]
    assert 'UID:' in new_fname.read()


@pytest.mark.parametrize('repair_uids', [None, True, False])
def test_repair_uids(storage, runner, repair_uids):
    f = storage.join('baduid.txt')
    orig_f = 'BEGIN:VCARD\nUID:!!!!!\nEND:VCARD'
    f.write(orig_f)

    if repair_uids is None:
        opt = []
    elif repair_uids:
        opt = ['--repair-unsafe-uid']
    else:
        opt = ['--no-repair-unsafe-uid']

    result = runner.invoke(['repair'] + opt + ['foo'], input='y')
    assert not result.exception

    if repair_uids:
        assert 'UID or href is unsafe, assigning random UID' in result.output
        assert not f.exists()
        new_f, = storage.listdir()
        s = new_f.read().strip()

        assert s.startswith('BEGIN:VCARD')
        assert s.endswith('END:VCARD')
        assert s != orig_f
    else:
        assert 'UID may cause problems, add --repair-unsafe-uid to repair.' \
            in result.output
        assert f.read() == orig_f
