# standard imports
import datetime
import logging

# third-party imports
import celery

# local imports
from cic_ussd.account.tokens import get_cached_token_data
from cic_ussd.account.transaction import from_wei
from cic_ussd.notifications import Notifier
from cic_ussd.phone_number import Support

celery_app = celery.current_app
logg = logging.getLogger(__file__)
notifier = Notifier()


@celery_app.task
def transaction(notification_data: dict):
    """
    :param notification_data:
    :type notification_data:
    :return:
    :rtype:
    """
    role = notification_data.get('role')
    token_value = notification_data.get('token_value')
    token_symbol = notification_data.get('token_symbol')
    blockchain_address = notification_data.get('blockchain_address')
    token_data = get_cached_token_data(blockchain_address, token_symbol)
    decimals = token_data.get('decimals')
    amount = token_value if token_value == 0 else from_wei(decimals, token_value)
    balance = notification_data.get('available_balance')
    phone_number = notification_data.get('phone_number')
    preferred_language = notification_data.get('preferred_language')

    alt_metadata_id = notification_data.get('alt_metadata_id')
    metadata_id = notification_data.get('metadata_id')
    transaction_type = notification_data.get('transaction_type')
    timestamp = datetime.datetime.now().strftime('%d-%m-%y, %H:%M %p')

    if transaction_type == 'tokengift':
        notifier.send_sms_notification(
            key='sms.account_successfully_created',
            phone_number=phone_number,
            preferred_language=preferred_language,
            support_phone=Support.phone_number)

    if transaction_type == 'transfer':
        if role == 'recipient':
            notifier.send_sms_notification('sms.received_tokens',
                                           phone_number=phone_number,
                                           preferred_language=preferred_language,
                                           amount=amount,
                                           token_symbol=token_symbol,
                                           tx_recipient_information=metadata_id,
                                           tx_sender_information=alt_metadata_id,
                                           timestamp=timestamp,
                                           balance=balance)
        if role == 'sender':
            notifier.send_sms_notification('sms.sent_tokens',
                                           phone_number=phone_number,
                                           preferred_language=preferred_language,
                                           amount=amount,
                                           token_symbol=token_symbol,
                                           tx_recipient_information=alt_metadata_id,
                                           tx_sender_information=metadata_id,
                                           timestamp=timestamp,
                                           balance=balance)
