from __future__ import absolute_import
from __future__ import unicode_literals

import os

import pytest

from pre_commit_hooks.sort_simple_yaml import first_key
from pre_commit_hooks.sort_simple_yaml import main
from pre_commit_hooks.sort_simple_yaml import parse_block
from pre_commit_hooks.sort_simple_yaml import parse_blocks
from pre_commit_hooks.sort_simple_yaml import sort

RETVAL_GOOD = 0
RETVAL_BAD = 1
TEST_SORTS = [
    (
        ['c: true', '', 'b: 42', 'a: 19'],
        ['b: 42', 'a: 19', '', 'c: true'],
        RETVAL_BAD,
    ),

    (
        ['# i am', '# a header', '', 'c: true', '', 'b: 42', 'a: 19'],
        ['# i am', '# a header', '', 'b: 42', 'a: 19', '', 'c: true'],
        RETVAL_BAD,
    ),

    (
        ['# i am', '# a header', '', 'already: sorted', '', 'yup: i am'],
        ['# i am', '# a header', '', 'already: sorted', '', 'yup: i am'],
        RETVAL_GOOD,
    ),

    (
        ['# i am', '# a header'],
        ['# i am', '# a header'],
        RETVAL_GOOD,
    ),
]


@pytest.mark.parametrize('bad_lines,good_lines,retval', TEST_SORTS)
def test_integration_good_bad_lines(tmpdir, bad_lines, good_lines, retval):
    file_path = os.path.join(tmpdir.strpath, 'foo.yaml')

    with open(file_path, 'w') as f:
        f.write('\n'.join(bad_lines) + '\n')

    assert main([file_path]) == retval

    with open(file_path, 'r') as f:
        assert [line.rstrip() for line in f.readlines()] == good_lines


def test_parse_header():
    lines = ['# some header', '# is here', '', 'this is not a header']
    assert parse_block(lines, header=True) == ['# some header', '# is here']
    assert lines == ['', 'this is not a header']

    lines = ['this is not a header']
    assert parse_block(lines, header=True) == []
    assert lines == ['this is not a header']


def test_parse_block():
    # a normal block
    lines = ['a: 42', 'b: 17', '', 'c: 19']
    assert parse_block(lines) == ['a: 42', 'b: 17']
    assert lines == ['', 'c: 19']

    # a block at the end
    lines = ['c: 19']
    assert parse_block(lines) == ['c: 19']
    assert lines == []

    # no block
    lines = []
    assert parse_block(lines) == []
    assert lines == []


def test_parse_blocks():
    # normal blocks
    lines = ['a: 42', 'b: 17', '', 'c: 19']
    assert parse_blocks(lines) == [['a: 42', 'b: 17'], ['c: 19']]
    assert lines == []

    # a single block
    lines = ['a: 42', 'b: 17']
    assert parse_blocks(lines) == [['a: 42', 'b: 17']]
    assert lines == []

    # no blocks
    lines = []
    assert parse_blocks(lines) == []
    assert lines == []


def test_first_key():
    # first line
    lines = ['a: 42', 'b: 17', '', 'c: 19']
    assert first_key(lines) == 'a: 42'

    # second line
    lines = ['# some comment', 'a: 42', 'b: 17', '', 'c: 19']
    assert first_key(lines) == 'a: 42'

    # second line with quotes
    lines = ['# some comment', '"a": 42', 'b: 17', '', 'c: 19']
    assert first_key(lines) == 'a": 42'

    # no lines (not a real situation)
    lines = []
    assert first_key(lines) == ''


@pytest.mark.parametrize('bad_lines,good_lines,_', TEST_SORTS)
def test_sort(bad_lines, good_lines, _):
    assert sort(bad_lines) == good_lines
