#!/usr/bin/env python3

from os import path, remove, system, walk
from pathlib import Path
from shutil import rmtree
from sshyp import decrypt

# TODO extract and move MFA data to dedicated field, if present

if __name__ == "__main__":
    _pasture = path.expanduser('~/.local/share/sshyp')
    
    _gpg_id = input('\nWhat is the ID of the GPG key you would like to use for re-encryption?\n\nID: ')

    # remove previous export if it exists
    if Path(f"{_pasture}.export").exists():
        rmtree(f"{_pasture}.export")

    # prompt for unlock and display do not close warning
    decrypt(None)
    print('entry conversion may take some time (especially on slower devices)\n\ndo not terminate this process!')

    # iterate over entires, exporting them in the libmutton format
    if path.isdir(_pasture):
        for _dirPath, _dirNames, _filenames in walk(_pasture):
            for _filename in sorted(_filenames):
                # ensure parent directory within export tree exists
                Path(_dirPath.replace(_pasture, _pasture + '.export')).mkdir(0o700, parents=True, exist_ok=True)

                # remove the .gpg file extension, if it is present
                # prevents saving with the extension, as libmutton does not require it
                if _filename.endswith('.gpg'):
                    _filename = _filename[:-4]

                # decrypt to export directory, append .gpg to decrypted file to differentiate from new file
                system(f"gpg -d '{_dirPath}/{_filename}.gpg' > '{_dirPath.replace(_pasture, _pasture + '.export')}/{_filename}.gpg'")

                _old_contents, _new_contents = open(f"{_dirPath.replace(_pasture, _pasture + '.export')}/{_filename}.gpg", 'r').readlines(), ''

                # add a new line reserved for libmutton's TOTP support (between username and URL)
                for _num in range(len(_old_contents)):
                    match _num:
                        case 0:               
                            _new_contents += _old_contents[0] 
                        case 1:
                            _new_contents += _old_contents[1]
                        case 2:
                            _new_contents += ''
                        case 3:
                            _new_contents += _old_contents[2]
                        case _:
                            _new_contents += _old_contents[_num]

                # remove any trailing whitespace
                for _num in reversed(range(len(_new_contents))):
                    if _new_contents[_num] in ('\n', '', ' '):
                        _new_contents = _new_contents[:-1]
                    else:
                        break

                # write and encrypt the output file
                open(f"{_dirPath.replace(_pasture, _pasture + '.export')}/{_filename}.gpg", 'w').writelines(_new_contents)
                system(f"gpg -er {str(_gpg_id)} -o '{_dirPath.replace(_pasture, _pasture + '.export')}/{_filename}' '{_dirPath.replace(_pasture, _pasture + '.export')}/{_filename}.gpg'")
                remove(f"{_dirPath.replace(_pasture, _pasture + '.export')}/{_filename}.gpg")
    else:
        print(f"\n\u001b[38;5;9merror: no entry folder ({_pasture}) found\u001b[0m\n")
        s_exit(2)

