"""Test init"""

import pytest


@pytest.mark.parametrize(
    'alt_work, repo_present, force', [
        (False, False, False),
        (True, False, False),
        (False, True, False),
        (False, True, True),
        (True, True, True),
    ], ids=[
        'simple',
        '-w',
        'existing repo',
        '-f',
        '-w & -f',
    ])
@pytest.mark.usefixtures('ds1_work_copy')
def test_init(
        runner, yadm_cmd, paths, repo_config, alt_work, repo_present, force):
    """Test init

    Repos should have attribs:
        - 0600 permissions
        - not bare
        - worktree = $HOME
        - showUntrackedFiles = no
        - yadm.managed = true
    """

    # these tests will assume this for $HOME
    home = str(paths.root.mkdir('HOME'))

    # ds1_work_copy comes WITH an empty repo dir present.
    old_repo = paths.repo.join('old_repo')
    if repo_present:
        # Let's put some data in it, so we can confirm that data is gone when
        # forced to be overwritten.
        old_repo.write('old repo data')
        assert old_repo.isfile()
    else:
        paths.repo.remove()

    # command args
    args = ['init']
    cwd = None
    if alt_work:
        if force:
            cwd = paths.work.dirname
            args.extend(['-w', paths.work.basename])
        else:
            args.extend(['-w', paths.work])
    if force:
        args.append('-f')

    # run init
    run = runner(yadm_cmd(*args), env={'HOME': home}, cwd=cwd)

    if repo_present and not force:
        assert run.failure
        assert 'repo already exists' in run.err
        assert old_repo.isfile(), 'Missing original repo'
    else:
        assert run.success
        assert 'Initialized empty shared Git repository' in run.out

        if repo_present:
            assert not old_repo.isfile(), 'Original repo still exists'
        else:
            assert run.err == ''

        if alt_work:
            assert repo_config('core.worktree') == paths.work
        else:
            assert repo_config('core.worktree') == home

        # uniform repo assertions
        assert oct(paths.repo.stat().mode).endswith('00'), (
            'Repo is not secure')
        assert repo_config('core.bare') == 'false'
        assert repo_config('status.showUntrackedFiles') == 'no'
        assert repo_config('yadm.managed') == 'true'