#!/usr/bin/python3

from __future__ import print_function

import apt
import apt_pkg

def blacklisted(name):
    # we need to blacklist linux-image-* as it does not install
    # cleanly in the chroot (postinst failes)
    blacklist = ["linux-image-","ltsp-client",
                 "glibc-doc-reference", "libpthread-dev",
                 "cman", "mysql-server", "fuse-utils",
                 "ltspfs", "gfs2-tools", "edubuntu-server",
                 "gnbd-client", "gnbd-server", "mysql-server-5.0",
                 "rgmanager", "clvm","redhat-cluster-suit",
                 # has a funny "can not be upgraded automatically" policy
                 # see debian #368226
                 "quagga",
                 "system-config-cluster", "gfs-tools"]
    for b in blacklist:
        if name.startswith(b):
            return True
    return False

#apt_pkg.config.set("Dir::State::status","./empty")

cache = apt.Cache()
group = apt_pkg.ActionGroup(cache._depcache)
#print([pkg.name for pkg in cache if pkg.is_installed])

troublemaker = set()
for pkg in cache:
    if not pkg.candidate:
        continue
    for c in pkg.candidate.origins:
        if c.component == "main":
            current = set([p.name for p in cache if p.marked_install])
            if not (pkg.is_installed or blacklisted(pkg.name)):
                pkg.mark_install()
            new = set([p.name for p in cache if p.marked_install])
            #if not pkg.marked_install or len(new) < len(current):
            if not (pkg.is_installed or pkg.marked_install):
                print("Can't install: %s" % pkg.name)
            if len(current-new) > 0:
                troublemaker.add(pkg.name)
                print("Installing '%s' caused removals_ %s" % (pkg.name, current - new))

#print(len(troublemaker))
for pkg in ["ubuntu-desktop", "ubuntu-minimal", "ubuntu-standard"]:
    cache[pkg].mark_install()

# make sure we don't install blacklisted stuff
for pkg in cache:
    if blacklisted(pkg.name):
        pkg.mark_keep()

print("We can install:")
print(len([pkg.name for pkg in cache if pkg.marked_install]))
print("Download: ")
pm = apt_pkg.PackageManager(cache._depcache)
fetcher = apt_pkg.Acquire()
pm.get_archives(fetcher, cache._list, cache._records)
print(apt_pkg.size_to_str(fetcher.fetch_needed))
print("Total space: ", apt_pkg.size_to_str(cache._depcache.usr_size))

res = False
current = 0
maxRetries = 3
while current < maxRetries:
    try:
        res = cache.commit(apt.progress.text.AcquireProgress(),
                           apt.progress.base.InstallProgress())    
    except IOError as e:
        # fetch failed, will be retried
        current += 1
        print("Retrying to fetch: ", current)
        continue
    except SystemError as e:
        print("Error installing packages! ")
        print(e)
    print("Install result: ", res)
    break
