from __future__ import unicode_literals
import os
import shutil
import time
from random import randint
from requests_toolbelt import MultipartEncoder
import json

from . import config
from .api_photo import resize_image, compatible_aspect_ratio, get_image_size


def download_story(self, filename, story_url, username):
    path = "stories/{}".format(username)
    if not os.path.exists(path):
        os.makedirs(path)
    fname = os.path.join(path, filename)
    if os.path.exists(fname):  # already exists
        self.logger.info("Stories already downloaded...")
        return os.path.abspath(fname)
    response = self.session.get(story_url, stream=True)
    if response.status_code == 200:
        with open(fname, 'wb') as f:
            response.raw.decode_content = True
            shutil.copyfileobj(response.raw, f)
        return os.path.abspath(fname)


def upload_story_photo(self, photo, upload_id=None):
    if upload_id is None:
        upload_id = str(int(time.time() * 1000))
    photo = resize_image(photo)
    if not photo:
        return False
    if not compatible_aspect_ratio(get_image_size(photo)):
        self.logger.error('Photo does not have a compatible photo aspect ratio.')
        return False

    with open(photo, 'rb') as f:
        photo_bytes = f.read()

    data = {
        'upload_id': upload_id,
        '_uuid': self.uuid,
        '_csrftoken': self.token,
        'image_compression': '{"lib_name":"jt","lib_version":"1.3.0","quality":"87"}',
        'photo': ('pending_media_%s.jpg' % upload_id, photo_bytes, 'application/octet-stream', {'Content-Transfer-Encoding': 'binary'})
    }
    m = MultipartEncoder(data, boundary=self.uuid)
    self.session.headers.update({'X-IG-Capabilities': '3Q4=',
                                 'X-IG-Connection-Type': 'WIFI',
                                 'Cookie2': '$Version=1',
                                 'Accept-Language': 'en-US',
                                 'Accept-Encoding': 'gzip, deflate',
                                 'Content-type': m.content_type,
                                 'Connection': 'close',
                                 'User-Agent': self.user_agent})
    response = self.session.post(
        config.API_URL + "upload/photo/", data=m.to_string())

    if response.status_code == 200:
        upload_id = json.loads(response.text).get('upload_id')
        if self.configure_story(upload_id, photo):
            # self.expose()
            return True
    return False


def configure_story(self, upload_id, photo):
    (w, h) = get_image_size(photo)
    data = self.json_data({
        'source_type': 4,
        'upload_id': upload_id,
        'story_media_creation_date': str(int(time.time()) - randint(11, 20)),
        'client_shared_at': str(int(time.time()) - randint(3, 10)),
        'client_timestamp': str(int(time.time())),
        'configure_mode': 1,      # 1 - REEL_SHARE, 2 - DIRECT_STORY_SHARE
        'device': self.device_settings,
        'edits': {
            'crop_original_size': [w * 1.0, h * 1.0],
            'crop_center': [0.0, 0.0],
            'crop_zoom': 1.3333334
        },
        'extra': {
            'source_width': w,
            'source_height': h,
        }})
    return self.send_request('media/configure_to_story/?', data)
