import os
import zipfile

from buildstream.utils import sha256sum

from buildstream.testing import Repo


class Zip(Repo):

    def create(self, directory):
        archive = os.path.join(self.repo, 'file.zip')

        old_dir = os.getcwd()
        os.chdir(directory)
        with zipfile.ZipFile(archive, "w") as zipfp:
            for root, dirs, files in os.walk('.'):
                names = dirs + files
                names = [os.path.join(root, name) for name in names]

                for name in names:
                    zipfp.write(name)

        os.chdir(old_dir)

        return sha256sum(archive)

    def source_config(self, ref=None):
        archive = os.path.join(self.repo, 'file.zip')
        config = {
            'kind': 'zip',
            'url': 'file://' + archive,
            'directory': '',
            'base-dir': ''
        }
        if ref is not None:
            config['ref'] = ref

        return config
