# standard imports
import os

# third party imports
import pytest

# local imports
from cic_ussd.files.local_files import create_local_file_data_stores
from cic_ussd.menu.ussd_menu import UssdMenu
from tests.helpers.tmp_files import create_tmp_file


@pytest.mark.parametrize('menu_name, expected_parent_menu_name', [
    ('initial_language_selection', None),
    ('account_management', 'start'),
    ('enter_current_pin', 'account_management')
])
def test_ussd_menu(load_ussd_menu, menu_name, expected_parent_menu_name):
    ussd_menu = UssdMenu.find_by_name(name=menu_name)
    assert ussd_menu.get('parent') == expected_parent_menu_name


def test_create_ussd_menu():
    descriptor, tmp_file = create_tmp_file()
    ussd_menu_db = create_local_file_data_stores(file_location=tmp_file, table_name="ussd_menu")
    UssdMenu.ussd_menu_db = ussd_menu_db
    UssdMenu(name='foo', description='foo-bar', parent=None)
    assert UssdMenu.find_by_name(name='foo')['description'] == 'foo-bar'
    UssdMenu.set_description(name='foo', description='bar')
    assert UssdMenu.find_by_name(name='foo')['description'] == 'bar'
    menu2 = UssdMenu(name='fizz', description='buzz', parent='foo')
    assert UssdMenu.parent_menu(menu2.name)['description'] == 'bar'
    os.close(descriptor)
    os.remove(tmp_file)


def test_failed_create_ussd_menu():
    descriptor, tmp_file = create_tmp_file()
    ussd_menu_db = create_local_file_data_stores(file_location=tmp_file, table_name="ussd_menu")
    UssdMenu.ussd_menu_db = ussd_menu_db
    UssdMenu(name='foo', description='foo-bar', parent=None)
    assert UssdMenu.find_by_name(name='foo')['description'] == 'foo-bar'
    UssdMenu.set_description(name='foo', description='bar')
    assert UssdMenu.find_by_name(name='foo')['description'] == 'bar'

    with pytest.raises(ValueError) as error:
        UssdMenu(name='foo', description='foo-bar', parent=None)

    assert str(error.value) == "Menu already exists!"
    os.close(descriptor)
    os.remove(tmp_file)