#!/usr/bin/python3
# coding: utf8
from __future__ import unicode_literals, absolute_import, division, print_function

import os
import shutil
import sys
import argparse
from collections import namedtuple


def get_bool_env_var(name):
    return os.getenv(name, '').lower() in ['yes', '1', 'Y', 'y', 'true']


USE_EPHEMERAL_STORAGE = get_bool_env_var('RASP_QLOUD_USE_EPHEMERAL_STORAGE')
ORIGIN_BACKUP_BASE = '/original'


class Storage(namedtuple('Storage', ['name', 'origin_path', 'enabled_env_name'])):
    @property
    def enabled(self):
        return USE_EPHEMERAL_STORAGE or get_bool_env_var(self.enabled_env_name)

    @property
    def ephemeral_path(self):
        return os.path.join('/ephemeral', self.name)

    @property
    def origin_backup_path(self):
        return os.path.join(ORIGIN_BACKUP_BASE, self.name)

    def setup(self):
        assert '/' not in self.name
        if not os.path.exists(self.ephemeral_path):
            print('Creating directory', self.ephemeral_path)
            try:
                shutil.copytree(self.origin_path, self.ephemeral_path)
            except (shutil.Error, OSError) as ex:
                print('Failed with error:', repr(ex))
                exit(1)
        if os.path.exists(self.origin_backup_path):
            print('Warning! Original path for {} exists, container was not changed.'.format(self.name), file=sys.stderr)
            return
        if not os.path.exists(ORIGIN_BACKUP_BASE):
            os.makedirs(ORIGIN_BACKUP_BASE)
        shutil.move(self.origin_path, self.origin_backup_path)
        os.symlink(self.ephemeral_path, self.origin_path)

def setup():
    for storage in STORAGES:
        print('Checking storage: {}, storage is {}'.format(storage.name, 'enabled' if storage.enabled else 'disabled'))
        if storage.enabled:
            print('Setting up storage: ', storage)
            storage.setup()


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('action', choices=('add',))
    parser.add_argument('--name', required=True)
    parser.add_argument('--origin-path', required=True)
    parser.add_argument('--enabled-env-name')

    args = parser.parse_args()

    storage = Storage(args.name, args.origin_path, args.enabled_env_name)
    if storage.enabled:
        storage.setup()
