import logging
import argparse
import sys
import os


class App:
    def __init__(self):
        # Argument Parser
        self.parser = argparse.ArgumentParser()
        self.parser.add_argument("-d", "--debug", action="store_true", help="Debug")
        # Logging
        self.logger = logging.getLogger()
        # Application specific initialization
        self.init()

    def __call__(self):
        self.args, _ = self.parser.parse_known_args()
        if "func" not in self.args:
            self.parser.error("Choose something to do")
        # configure log output
        self.log_level = logging.DEBUG if self.args.debug else logging.INFO
        self.logger.setLevel(self.log_level)
        self.handler = logging.StreamHandler(sys.stdout)
        self.handler.setLevel(self.log_level)
        self.formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s")
        self.handler.setFormatter(self.formatter)
        self.logger.addHandler(self.handler)

        # execute requested function
        self.before()
        return_code = self.args.func()
        self.after()
        if isinstance(return_code, int):
            exit(return_code)
        else:
            self.logger.error(f"Missing return code")
            exit(255)

    def init(self):
        raise Exception("init() is not implemented")

    def before(self):
        pass

    def after(self):
        pass