__filename__ = "petnames.py"
__author__ = "Bob Mottram"
__license__ = "AGPL3+"
__version__ = "1.2.0"
__maintainer__ = "Bob Mottram"
__email__ = "bob@freedombone.net"
__status__ = "Production"

import os


def setPetName(baseDir: str, nickname: str, domain: str,
               handle: str, petname: str) -> bool:
    """Adds a new petname
    """
    if '@' not in handle:
        return False
    if ' ' in petname:
        petname = petname.replace(' ', '_')
    if handle.startswith('@'):
        handle = handle[1:]
    if petname.startswith('@'):
        petname = petname[1:]
    petnamesFilename = baseDir + '/accounts/' + \
        nickname + '@' + domain + '/petnames.txt'
    entry = petname + ' ' + handle + '\n'

    # does this entry already exist?
    if os.path.isfile(petnamesFilename):
        with open(petnamesFilename, 'r') as petnamesFile:
            petnamesStr = petnamesFile.read()
            if entry in petnamesStr:
                return True
            if ' ' + handle + '\n' in petnamesStr:
                petnamesList = petnamesStr.split('\n')
                newPetnamesStr = ''
                for pet in petnamesList:
                    if not pet.endswith(' ' + handle):
                        newPetnamesStr += pet + '\n'
                    else:
                        newPetnamesStr += entry
                # save the updated petnames file
                with open(petnamesFilename, 'w+') as petnamesFile:
                    petnamesFile.write(newPetnamesStr)
                return True
            # entry does not exist in the petnames file
            with open(petnamesFilename, 'a+') as petnamesFile:
                petnamesFile.write(entry)
            return True

    # first entry
    with open(petnamesFilename, 'w+') as petnamesFile:
        petnamesFile.write(entry)
    return True


def getPetName(baseDir: str, nickname: str, domain: str,
               handle: str) -> str:
    """Given a handle returns the petname
    """
    if '@' not in handle:
        return ''
    if handle.startswith('@'):
        handle = handle[1:]
    petnamesFilename = baseDir + '/accounts/' + \
        nickname + '@' + domain + '/petnames.txt'

    if not os.path.isfile(petnamesFilename):
        return ''
    with open(petnamesFilename, 'r') as petnamesFile:
        petnamesStr = petnamesFile.read()
        if ' ' + handle + '\n' in petnamesStr:
            petnamesList = petnamesStr.split('\n')
            for pet in petnamesList:
                if pet.endswith(' ' + handle):
                    return pet.replace(' ' + handle, '').strip()
    return ''


def _getPetNameHandle(baseDir: str, nickname: str, domain: str,
                      petname: str) -> str:
    """Given a petname returns the handle
    """
    if petname.startswith('@'):
        petname = petname[1:]
    petnamesFilename = baseDir + '/accounts/' + \
        nickname + '@' + domain + '/petnames.txt'

    if not os.path.isfile(petnamesFilename):
        return ''
    with open(petnamesFilename, 'r') as petnamesFile:
        petnamesStr = petnamesFile.read()
        if petname + ' ' in petnamesStr:
            petnamesList = petnamesStr.split('\n')
            for pet in petnamesList:
                if pet.startswith(petname + ' '):
                    handle = pet.replace(petname + ' ', '').strip()
                    return handle
    return ''


def resolvePetnames(baseDir: str, nickname: str, domain: str,
                    content: str) -> str:
    """Replaces petnames with their full handles
    """
    if not content:
        return content
    if ' ' not in content:
        return content
    words = content.strip().split(' ')
    for wrd in words:
        # check initial words beginning with @
        if not wrd.startswith('@'):
            break
        # does a petname handle exist for this?
        handle = _getPetNameHandle(baseDir, nickname, domain, wrd)
        if not handle:
            continue
        # replace the petname with the handle
        content = content.replace(wrd + ' ', '@' + handle + ' ')
    return content
