#!/usr/bin/env python2.7
#
#  crapshoot - testing driver management
#
#  Copyright 2017 Ikey Doherty <ikey@solus-project.com>
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#

from doflicky import OSContext
from doflicky.driver.nvidia import DriverBundleNvidia
from doflicky.driver.broadcom import DriverBundleBroadcom
import pisi
from pisi.db.installdb import InstallDB

class BundleSet:

    drivers = None
    allDrivers = None
    uniqueDrivers = None
    emul32Triggers = None
    db = None
    context = None

    def __init__(self):
        """ Initialise the potential driver bundle set """
        self.drivers = [
            DriverBundleNvidia(),
            DriverBundleBroadcom(),
        ]
        self.allDrivers = list()
        self.uniqueDrivers = list()
        self.emul32Triggers = dict()
        self.context = OSContext()

        self.db = InstallDB()
        for driver in self.drivers:
            for pkg in driver.triggers_emul32():
                if self.db.has_package(pkg):
                    self.emul32Triggers[driver] = True

    def detect(self):
        """ Perform main detection routine """
        for driver in self.drivers:
            if driver.is_present():
                self.add_driver(driver)

    def add_driver(self, driver):
        """ Attempt to add a driver to the set and avoid conflicts """
        base = driver.get_base()
        self.allDrivers.append(driver)
        if base is not None:
            otherDrivers = [x for x in self.uniqueDrivers if x.get_base() == base]

            for existing in otherDrivers:
                if existing.get_priority() > driver:
                    print("DEBUG: {} shadowed by existing {}".format(
                        driver.get_name(), existing.get_name()))
                    return
                elif driver.get_priority() > existing.get_priority():
                    self.uniqueDrivers.remove(existing)
                    self.uniqueDrivers.append(driver)

            if len(otherDrivers) < 1:
                self.uniqueDrivers.append(driver)
        else:
            self.uniqueDrivers.append(driver)

if __name__ == "__main__":

    bs = BundleSet()
    bs.detect()

    for driver in bs.uniqueDrivers:
        print("Found supported hardware: %s" % driver.get_name())
        emul32 = False
        if driver in bs.emul32Triggers:
            emul32 = True
        pkgs = driver.get_packages(bs.context, emul32)
        print("Packages: %s" % ", ".join(pkgs))