from storage.local import LocalStorage
from storage.s3 import S3Storage
from storage.fakestorage import FakeStorage
from storage.distributedstorage import DistributedStorage


class Storage(object):
  def __init__(self, app=None):
    self.app = app
    if app is not None:
      self.state = self.init_app(app)
    else:
      self.state = None

  def init_app(self, app):
    # storage_type = app.config.get('STORAGE_TYPE', 'LocalStorage')
    # path = app.config.get('STORAGE_PATH', '')

    storages = {}
    for location, storage_params in app.config.get('DISTRIBUTED_STORAGE_CONFIG').items():
      driver = storage_params[0]

      if driver == 'LocalStorage':
        storage = LocalStorage(*storage_params[1:])
      elif driver == 'S3Storage':
        storage = S3Storage(*storage_params[1:])
      else:
        storage = FakeStorage()

      storages[location] = storage

    preference = app.config.get('DISTRIBUTED_STORAGE_PREFERENCE', None)
    if not preference:
      preference = storages.keys()

    d_storage = DistributedStorage(storages, preference)

    # register extension with app
    app.extensions = getattr(app, 'extensions', {})
    app.extensions['storage'] = d_storage
    return d_storage

  def __getattr__(self, name):
    return getattr(self.state, name, None)