from schwifty import IBAN, BIC
import datetime
from validator_collection import validators, errors


def valid_iban(field, value, error):
    try:
        IBAN(value)
        return True
    except ValueError:
        error(field, 'not a valid IBAN')


def valid_bic(field, value, error):
    try:
        BIC(value)
        return True
    except ValueError:
        error(field, 'not a valid BIC')


def iso_date(field, value, error):
    try:
        datetime.datetime.strptime(value, "%Y-%m-%d")
        return True
    except ValueError:
        error(field, 'not a valid ISO 8601 date')


def valid_money_amount(field, value, error):
    try:
        # value is string, check formatting by parsing as float
        float(value)
        return True
    except (ValueError, TypeError):
        error(field, 'not a valid money value')


def valid_email(field, value, error):
    try:
        validators.email(value)
        return True
    except errors.InvalidEmailError:
        error(field, 'not a valid email')