import json
import typing

import requests
import retrying
from aws_lambda_tools.common.decorators import handle_session, aws_encode, json_encode
from conio_domain.base_client import SafeClient
from conio_sdk_generated.openapi.v2.serde.models.confirm_email import ConfirmEmail
from conio_sdk_generated.openapi.v2.serde.models.success import Success
from merchant_wallet_libs.logging import requests

from conio_sdk.common.decorators import log_this
from conio_sdk.context import AWS_CONTEXT
from etc import settings


@log_this
@handle_session(AWS_CONTEXT)
@aws_encode()
@json_encode(message_type=ConfirmEmail)
@retrying.retry(
    wait_fixed=3000, stop_max_attempt_number=15,
    retry_on_exception=lambda e: isinstance(e, ValueError) and e.args[0] == 'no such email'
)
def confirm_email(msg: ConfirmEmail, event: typing.Dict, context=None):
    emails = ChatterBackofficeClient().get_emails(mailtype='confirm_and_unlock', recipient=msg.email, limit=1)
    if not emails['rows']:
        raise ValueError('no such email')
    url = emails['rows'][0]['meta']['meta']['button_link']
    token = url.split('/')[-1]
    resp = requests.get(f'http://vault.development.conio.com:8080/email/{token}')
    resp.raise_for_status()
    return Success(status='success')


class ChatterBackofficeClient(SafeClient):
    def __init__(self):
        super().__init__(
            settings.CHATTER_URL,
            settings.CHATTER_SECRET_KEY
        )

    def get_emails(self, mailtype=None, offset=0, limit=50, status=None, print_res=False, recipient=None):
        params = {
            '_offset': offset,
            '_limit': limit,
        }
        if mailtype:
            params['_type'] = mailtype
        if status:
            params['_status'] = status
        if recipient:
            params['_recipient'] = recipient

        print('chatterbackofficeclient.get_emails params: ', params)
        response = self._remote_execution(
            requests.get,
            url='backoffice/email',
            params=params
        )
        if print_res:
            print('chatterbackofficeclient.get_emails response: ', response)
        return response.decode() and json.loads(response.decode())
