#!/usr/bin/env python


class BrowserDriverFactory(object):

    browser_drivers = {}
    platforms = set()
    browsers = set()

    @classmethod
    def available_platforms(cls):
        return list(cls.platforms)

    @classmethod
    def available_browsers(cls):
        return list(cls.browsers)

    @classmethod
    def add_browser_driver(cls, platform, browser_name, browser_driver_class):
        cls.platforms.add(platform)
        cls.browsers.add(browser_name)
        if platform not in cls.browser_drivers:
            cls.browser_drivers[platform] = {}
        cls.browser_drivers[platform][browser_name] = browser_driver_class

    @classmethod
    def create(cls, platform, browser_name):
        if browser_name not in cls.browser_drivers[platform]:
            raise ValueError("Browser \"%s\" is not available on platform \"%s\"" % (browser_name, platform))
        return cls.browser_drivers[platform][browser_name]()
