# standard imports
import os
import random

# external imports
import pytest

# local imports
from cic_ussd.db.models.ussd_session import UssdSession
from cic_ussd.session.ussd_session import create_ussd_session

# test imports
from tests.helpers.accounts import phone_number


@pytest.fixture(scope='function')
def activated_account_ussd_session(load_config, activated_account):
    valid_service_codes = load_config.get('USSD_SERVICE_CODE').split(",")
    return {
        'data': {},
        'external_session_id': os.urandom(20).hex(),
        'msisdn': activated_account.phone_number,
        'service_code': valid_service_codes[0],
        'state': 'initial_language_selection',
        'user_input': '1',
    }


@pytest.fixture(scope='function')
def generic_ussd_session(load_config, activated_account):
    valid_service_codes = load_config.get('USSD_SERVICE_CODE').split(",")
    return {
        'data': {},
        'service_code': valid_service_codes[0],
        'state': 'initial_language_selection',
        'user_input': '1',
        'version': 2
    }


@pytest.fixture(scope='function')
def ussd_session_traffic(generic_ussd_session, init_database, persisted_ussd_session):
    for _ in range((random.randint(5, 15))):
        generic_ussd_session['external_session_id'] = os.urandom(20).hex()
        generic_ussd_session['msisdn'] = phone_number()
        ussd = UssdSession(**{key: value for key, value in generic_ussd_session.items()})
        init_database.add(ussd)
        init_database.commit()


@pytest.fixture(scope='function')
def ussd_session_data(load_config):
    return {
        'recipient': phone_number()
    }


@pytest.fixture(scope='function')
def cached_ussd_session(init_cache, activated_account_ussd_session):
    return create_ussd_session(**{key: value for key, value in activated_account_ussd_session.items()})


@pytest.fixture(scope='function')
def persisted_ussd_session(init_cache, init_database, activated_account_ussd_session):
    activated_account_ussd_session['version'] = 2
    ussd = UssdSession(**{key: value for key, value in activated_account_ussd_session.items()})
    init_database.add(ussd)
    init_database.commit()
    return ussd