"""
    This module stores data for "External Account" custom profile field.
"""
from typing import Optional
from django.utils.translation import ugettext as _

from zerver.lib.validator import check_required_string, \
    check_external_account_url_pattern, check_dict_only
from zerver.lib.types import ProfileFieldData

# Default external account fields are by default available
# to realm admins, where realm admin only need to select
# the default field and other values(i.e. name, url) will be
# fetch from this dictionary.
# text: Field text for admins - custom profile field in org settngs view
# name: Field label or name - user profile in user settings view
# hint: Field hint for realm users
# url_patter: Field url linkifier
DEFAULT_EXTERNAL_ACCOUNTS = {
    "twitter": {
        "text": "Twitter",
        "url_pattern": "https://twitter.com/%(username)s",
        "name": "Twitter",
        "hint": "Enter your Twitter username",
    },
    "github": {
        "text": 'GitHub',
        "url_pattern": "https://github.com/%(username)s",
        "name": "GitHub",
        "hint": "Enter your GitHub username",
    },
}

def validate_external_account_field_data(field_data: ProfileFieldData) -> Optional[str]:
    field_validator = check_dict_only(
        [('subtype', check_required_string)],
        [('url_pattern', check_external_account_url_pattern)],
    )
    error = field_validator('field_data', field_data)
    if error:
        return error

    field_subtype = field_data.get('subtype')
    if field_subtype not in DEFAULT_EXTERNAL_ACCOUNTS.keys():
        if field_subtype == "custom":
            if 'url_pattern' not in field_data.keys():
                return _("Custom external account must define url pattern")
        else:
            return _("Invalid external account type")

    return None
