import logging
from zope.interface import implements
from lbrynet.cryptstream.CryptBlob import CryptBlobInfo
from lbrynet.interfaces import IMetadataHandler


log = logging.getLogger(__name__)


class LBRYFileMetadataHandler(object):
    implements(IMetadataHandler)

    def __init__(self, stream_hash, stream_info_manager, download_manager):
        self.stream_hash = stream_hash
        self.stream_info_manager = stream_info_manager
        self.download_manager = download_manager
        self._final_blob_num = None

    ######### IMetadataHandler #########

    def get_initial_blobs(self):
        d = self.stream_info_manager.get_blobs_for_stream(self.stream_hash)
        d.addCallback(self._format_initial_blobs_for_download_manager)
        return d

    def final_blob_num(self):
        return self._final_blob_num

    ######### internal calls #########

    def _format_initial_blobs_for_download_manager(self, blob_infos):
        infos = []
        for blob_hash, blob_num, iv, length in blob_infos:
            if blob_hash is not None:
                infos.append(CryptBlobInfo(blob_hash, blob_num, length, iv))
            else:
                log.debug("Setting _final_blob_num to %s", str(blob_num - 1))
                self._final_blob_num = blob_num - 1
        return infos