import __main__
from secrets import token_urlsafe as _token_urlsafe, token_hex as _token_hex
from string import ascii_letters as _ascii_letters
from random import choice as _choice
from os.path import dirname as _dirname, abspath as _abspath, join as _join, isfile as _isfile, isdir as _isdir
from os import makedirs as _makedirs


_HERE = _dirname(_abspath(__main__.__file__))
_PASSWORD_DIR = _join(_HERE, 'password')


def get_password(server_name: str, 
                 username: str,
                 description: str,
                 type: str,
                 length: int=20,
                 temporary: bool=True,
                 ) -> str:
    if type != 'cleartext':
        raise Exception('only cleartext is supported')
    def gen_password():
        return _token_urlsafe(length)[:length]
    return _set_password(server_name,
                         username,
                         description,
                         gen_password,
                         temporary,
                         )


def get_password_alpha_num(server_name,
                           username: str,
                           description: str,
                           length,
                           starts_with_char=False,
                           ):
    def gen_password():
        password = _token_hex()
        if starts_with_char:
            password = _choice(_ascii_letters) + password
        return password[:length]
    return _set_password(server_name,
                         username,
                         description,
                         gen_password,
                         True,
                         )


def _set_password(server_name: str, 
                  username: str,
                  description: str,
                  gen_password,
                  temporary,
                  ) -> str:
    if not server_name or not username:
        return
    dir_name = _join(_PASSWORD_DIR, server_name, description)
    if not _isdir(dir_name):
        _makedirs(dir_name)
    file_name = _join(dir_name, username)
    if not _isfile(file_name):
        password = gen_password()
        with open(file_name, 'w') as fh:
            fh.write(password)
    with open(file_name, 'r') as fh:
        return fh.read().strip()


def get_range(stop):
    return list(range(stop))


def get_number_of_interfaces(zones):
    if zones is None:
        return 1
    return len(zones)


def get_zone_name(zones: list,
                  index: str,
                  ):
    if zones is not None:
        return zones[int(index)]


def get_domain_name(server_name: str,
                    extra_domainnames: list,
                    suffix: str,
                    ) -> str:
    index = int(suffix)
    if index == 0:
        return server_name
    return extra_domainnames[index - 1]