# This sucks.  Make it not suck.
import os, shutil, tempfile, hashlib

chunk_size = 1024*1024 # TODO: is this a good chunk size?

from pylons import config

"""
Notes:
# Here's one way to move stuff...
shutil.copyfileobj(temp.file, dest_file)

# we should probably store the basename of the original filename in the database somewhere
temp_base = os.path.basename(temp.filename)

# You can get a mime type like so:
from mimetypes import guess_type
guess_type(temp.filename)[0]
"""

def get_path(space, hash):
    return "/" + os.path.join( space, hash[:2], hash[2:] )


def save_file(space, temp):

    dest_root = os.path.join( config['app_conf']['static_root'], space )

    # we don't know where we're going to save this stuff yet,
    # so I guess we'll write it to another tempfile.  One we know the path of.
    # I'm assuming the tempfile we get from pylons is set to delete itself
    # when it closes, and has no visible path.  Maybe I'm wrong?
    intermediate_file_descriptor, intermediate_path = tempfile.mkstemp()

    # that function gives me an integer file descriptor for some reason.
    intermediate_file = os.fdopen(intermediate_file_descriptor, "wb")

    sha1 = hashlib.sha1()
    while 1:
        data = temp.file.read(chunk_size)
        if not data:
            break
        sha1.update(data)
        intermediate_file.write(data)

    temp.file.close()
    intermediate_file.close()
    hash = sha1.hexdigest()

    # git convention: first two characters are the directory
    dest_dir = os.path.join( dest_root, hash[:2] )
    dest_path =  os.path.join( dest_dir, hash[2:] )

    makedirs(dest_dir)
    shutil.move(intermediate_path, dest_path)

    return hash



def makedirs(dir):
    try:
         os.makedirs(dir)
    except OSError:
         pass

