import os

from enum import Enum, auto

from .gn import GnBuilder


class GenioApp(Enum):
    LIGHT = auto()
    SHELL = auto()

    def ExampleName(self):
        if self == GenioApp.LIGHT:
            return 'lighting-app'
        elif self == GenioApp.SHELL:
            return 'shell'
        else:
            raise Exception('Unknown app type: %r' % self)

    def AppNamePrefix(self):
        if self == GenioApp.LIGHT:
            return 'chip-genio-lighting-app-example'
        elif self == GenioApp.SHELL:
            return 'chip-genio-shell-example'
        else:
            raise Exception('Unknown app type: %r' % self)

    def FlashBundleName(self):
        if self == GenioApp.LIGHT:
            return 'lighting_app.flashbundle.txt'
        elif self == GEnioApp.SHELL:
            return 'shell.flashbundle.txt'
        else:
            raise Exception('Unknown app type: %r' % self)

    def BuildRoot(self, root):
        return os.path.join(root, 'examples', self.ExampleName(), 'genio')


class GenioBuilder(GnBuilder):

    def __init__(self,
                 root,
                 runner,
                 app: GenioApp = GenioApp.LIGHT):
        super(GenioBuilder, self).__init__(
            root=app.BuildRoot(root),
            runner=runner)
        self.app = app

    def build_outputs(self):
        items = {}
        for extension in ['out', 'out.map', 'bin']:
            name = '%s.%s' % (self.app.AppNamePrefix(), extension)
            items[name] = os.path.join(self.output_dir, name)

        return items
