import hashlib
import os

PATH_NESTING = 2


def generate_path(base_dir, sha1):
    dir_parts = [base_dir]
    dir_parts.extend(sha1[:PATH_NESTING])
    base_path = os.path.join(*dir_parts)
    if not os.path.isdir(base_path):
        os.makedirs(base_path)
    return os.path.join(base_path, sha1)


def random_token():
    return hashlib.sha1(os.urandom(20)).hexdigest()


def sha1_of_file(path):
    with open(path, 'r') as fd:
        sha = hashlib.sha1()
        while True:
            chunk = fd.read(4096)
            if not chunk:
                break
            sha.update(chunk)
        return sha.hexdigest()


class SyntaxError(Exception):
    pass


def read_config_defaults(parser, path):
    if not os.path.exists(path):
        return
    with open(path, 'r') as fd:
        for linenum, line in enumerate(fd):
            line = line.strip()
            if not line or line.startswith('#'):
                continue
            if '=' not in line:
                raise SyntaxError('%s, line %d: Syntax Error' % (
                        path, 1 + linenum))
            var, value = map(lambda x: x.strip(), line.split('=', 1))
            parser.set_default(var, value)