#!/usr/bin/env python

import sys
from os.path import join
import argparse
import yaml

class Environment(dict):
    def __init__(self, config):
        try:
            env = config['environment']
        except KeyError:
            pass
        else:
            if isinstance(env, dict):
                super(Environment, self).__init__({ k: str(v)
                                                    for k, v in env.items() })


class Hooks:
    def __init__(self, config):
        pass


class Config:
    @classmethod
    def from_file(cls, file_):
        try:
            with open(file_) as f:
                return cls.from_stream(f)
        except Exception:
            return cls()

    @classmethod
    def from_stream(cls, stream):
        try:
            config = yaml.load(stream)
        except Exception:
            config = {}
        finally:
            return cls(config)

    def __init__(self, config={}):
        self.hooks = Hooks(config)
        self.env = Environment(config)
        self._config = config


class PythonConfig(Config):
    _DEFAULT_VERSION = ''
    _AVAILABLE_VERSIONS = set(['2.7', '3.2', '3.6'])

    def __version(self):
        try:
            version_ = self._config['python']['version']
            if version_ is None:
                return self._DEFAULT_VERSION
            return str(version_)
        except (KeyError, TypeError):
            return self._DEFAULT_VERSION

    def version(self):
        """Returns version specified by customers. If not specified, returns
           DEFAULT, if invalid, returns None"""
        version_ = self.__version()
        if version_ in self._AVAILABLE_VERSIONS:
            return version_


UWSGI_CONFIG_DIR='/srv/admin/configs/uwsgi/base'


def parse_arguments():
    parser = argparse.ArgumentParser(
        description='Displays requested python version'
    )
    parser.add_argument('--uwsgi-config', action='store_true')
    parser.add_argument('--config', metavar='CONFIG_FILE',
                        default='/srv/data/web/vhosts/default/gandi.yml')
    return parser.parse_args()

def main():
    args = parse_arguments()
    version = PythonConfig.from_file(args.config).version()
    if version is None:
        sys.exit(1)
    if args.uwsgi_config:
        print join(UWSGI_CONFIG_DIR, 'python%s.ini' % (version))
        return
    print version

if __name__ == '__main__':
    main()
