import binascii
import requests

from decouple import config
from pyotp import TOTP
from config import VM_POOL


def check_otp(name, realm, token):
    try:
        data = {
            "auth_name": config("AUTH_NAME", ""),
            "auth_token": TOTP(config("AUTH_SEED", "")).now(),
            "auth_realm": config("AUTH_REALM", ""),
            "name": name,
            "realm": realm,
            "token": token,
        }
    except binascii.Error:
        return 400

    response = requests.post(
        "{OTP_SERVER}{OTP_VERIFY_ENDPOINT}".format(
            OTP_SERVER=config("OTP_SERVER", ""),
            OTP_VERIFY_ENDPOINT=config("OTP_VERIFY_ENDPOINT", "verify/"),
        ),
        data=data,
    )
    return response.status_code


def resolve_vm_name(name, owner):
    """
    Input: name of vm, owner of vm
    Output: uuid of vm if found otherwise None
    """
    result = next(
        filter(
            lambda vm: vm.value["owner"] == owner and vm.value["name"] == name,
            VM_POOL.vms,
        ),
        None,
    )
    if result:
        return result.key.split("/")[-1]