from suds.client import Client
from base64 import b64decode, b64encode
import os
import json


class MemoQFile(object):
    """Client for memoQ File management API."""

    def __init__(self):
        with open("config.json") as json_file:
            self.config = json.load(json_file)

        if self.config["api_base_url"] != "":
            api_url = self.config["api_base_url"] + \
                "/memoqservices/filemanager?wdsl"
            self.client = Client(api_url)

    def download_file(self, path, guid):
        """Downloads file of given guid from memoQ Server to specified path. Returns full path of downloaded file."""
        chunk_size = 1000000
        start, filename, filesize = self.client.service.BeginChunkedFileDownload(
            guid, False)
        file_bytes_left = filesize[1]
        output_filename = os.path.join(path, filename[1])
        output = open(output_filename, 'wb')
        while file_bytes_left > 0:
            chunk = self.client.service.GetNextFileChunk(start[1], chunk_size)
            output.write(b64decode(chunk))
            file_bytes_left -= len(chunk)
        output.close()
        self.client.service.EndChunkedFileDownload(start[1])
        return output_filename

    def upload_file(self, file_path, chunk_size=1024):
        """Uploads given file to memoQ Server. Returns guid of uploaded file."""
        file_to_send = open(file_path, 'rb')
        file_guid = self.client.service.BeginChunkedFileUpload(
            file_path, False)
        while True:
            data = b64encode(file_to_send.read(chunk_size))
            if not data:
                break
            else:
                self.client.service.AddNextFileChunk(file_guid, data)

        self.client.service.EndChunkedFileUpload(file_guid)
        file_to_send.close()
        return file_guid