import io
import random

from hashlib import sha1

import requests
import numpy

from PIL import Image


# @TODO Update this to include code point ranges to be sampled
include_ranges = [
    ( 0x0021, 0x0021 ),
    ( 0x0023, 0x0026 ),
    ( 0x0028, 0x007E ),
    ( 0x00A1, 0x00AC ),
    ( 0x00AE, 0x00FF ),
    ( 0x0100, 0x017F ),
    ( 0x0180, 0x024F ),
    ( 0x2C60, 0x2C7F ),
    ( 0x16A0, 0x16F0 ),
    ( 0x0370, 0x0377 ),
    ( 0x037A, 0x037E ),
    ( 0x0384, 0x038A ),
    ( 0x038C, 0x038C ),
]

def random_utf8_string(length):
    alphabet = [
        chr(code_point) for current_range in include_ranges
            for code_point in range(current_range[0], current_range[1] + 1)
    ]
    return ''.join(random.choice(alphabet) for i in range(length))


def random_image(name, ts=8, ims=256):
    imarray = numpy.random.rand(ts, ts, 3) * 255
    im = Image.fromarray(imarray.astype('uint8')).convert('RGBA')
    im = im.resize((ims, ims), Image.NEAREST)

    imf = io.BytesIO()
    im.save(imf, format='png')
    imf.seek(0)
    hash = sha1(imf.read()).hexdigest()

    return {
        'content' : imf,
        'hash' : hash,
        'filename' : random_utf8_string(32) + '.png'
    }