import os

from foolscap import Referenceable
from twisted.application import service

from allmydata.bucketstore import BucketStore
from zope.interface import implements
from allmydata.interfaces import RIStorageServer
from allmydata.util import idlib

class BucketAlreadyExistsError(Exception):
    pass

class StorageServer(service.MultiService, Referenceable):
    implements(RIStorageServer)
    name = 'storageserver'

    def __init__(self, store_dir):
        if not os.path.isdir(store_dir):
            os.mkdir(store_dir)
        service.MultiService.__init__(self)
        self._bucketstore = BucketStore(store_dir)
        self._bucketstore.setServiceParent(self)

    def remote_allocate_bucket(self, verifierid, bucket_num, size, leaser,
                               canary):
        if self._bucketstore.has_bucket(verifierid):
            raise BucketAlreadyExistsError()
        lease = self._bucketstore.allocate_bucket(verifierid, bucket_num, size,
                                                  idlib.b2a(leaser), canary)
        return lease

    def remote_get_buckets(self, verifierid):
        return self._bucketstore.get_buckets(verifierid)