"""EasyEngine packages repository operations"""
from ee.core.shellexec import EEShellExec
from ee.core.variables import EEVariables
import os


class EERepo():
    """Manage Repositories"""

    def __init__(self):
        """Initialize """
        pass

    def add(self, repo_url=None, ppa=None):
        """
        This function used to add apt repositories and or ppa's
        If repo_url is provided adds repo file to
            /etc/apt/sources.list.d/
        If ppa is provided add apt-repository using
            add-apt-repository
        command.
        """

        if repo_url is not None:
            repo_file_path = ("/etc/apt/sources.list.d/"
                              + EEVariables().ee_repo_file)
            try:
                if not os.path.isfile(repo_file_path):
                    with open(repo_file_path,
                              encoding='utf-8', mode='a') as repofile:
                        repofile.write(repo_url)
                        repofile.write('\n')
                        repofile.close()
                elif repo_url not in open(repo_file_path,
                                          encoding='utf-8').read():
                    with open(repo_file_path,
                              encoding='utf-8', mode='a') as repofile:
                        repofile.write(repo_url)
                        repofile.write('\n')
                        repofile.close()
                return True
            except IOError as e:
                Log.debug(self, "{0}".format(e))
                Log.error(self, "File I/O error.")
            except Exception as e:
                Log.debug(self, "{0}".format(e))
                Log.error(self, "Unable to add repo")
        if ppa is not None:
            if EEVariables.ee_platform_distro == 'squeeze':
                print("Cannot add repo for {distro}"
                      .format(distro=EEVariables.ee_platform_distro))
            else:
                EEShellExec.cmd_exec(self, "add-apt-repository -y "
                                           "'{ppa_name}'"
                                     .format(ppa_name=ppa))

    def remove(self, ppa=None):
        """
        This function used to remove ppa's
        If ppa is provided adds repo file to
            /etc/apt/sources.list.d/
        command.
        """
        EEShellExec.cmd_exec(self, "add-apt-repository -y "
                             "--remove '{ppa_name}'"
                             .format(ppa_name=repo_url))

    def add_key(self, keyids, keyserver=None):
        """
        This function adds imports repository keys from keyserver.
        default keyserver is hkp://keys.gnupg.net
        user can provide other keyserver with keyserver="hkp://xyz"
        """
        EEShellExec.cmd_exec(self, "gpg --keyserver {serv}"
                             .format(serv=(keyserver or
                                           "hkp://keys.gnupg.net"))
                             + " --recv-keys {key}".format(key=keyids))
        EEShellExec.cmd_exec(self, "gpg -a --export --armor {0}"
                             .format(keyids)
                             + " | apt-key add - ")