import ftplib
from Modules.Ensembl.FTPHandling.FTPEntry import FTPEntry


class FTPHandler:

    """
    Class to browse through ftp folders and download entries to local file
    """

    def __init__(self, url, wd):
        self.ftp = ftplib.FTP(url)
        self.ftp.login()
        self.ftp.cwd(wd)

    def change_dir(self, wd):
        self.ftp.cwd(wd)

    def get_all_entries(self):
        return self.ftp.nlst()

    def get_all_entries_from_dir(self, dire):
        self.change_dir(dire)
        return self.get_all_entries()

    def get_all_entries_as_FTPEntry(self):
            # Get All Files
        files = self.ftp.nlst()
        return [FTPEntry(item, self.ftp, self.ftp.pwd()) for item in files]

    def save_entries_to_file(self, origin, target):
        self.change_dir(origin)
        for file in self.get_all_entries_as_FTPEntry():
            if file.gettype() == "f":
                # Download only Checksum & gff.gz files
                if file.getfilename() not in ["README", "manifest.tsv"]:
                    print("Downloading.......  > " + file.getfilename())
                    self.ftp.retrbinary("RETR " + file.getfilename(), open(target + "/" + file.getfilename(), 'wb').write)