#!/usr/bin/env {{ python }}

import os
import subprocess
import sys

LOCATION = r'{{ location }}'
SPACING = 8
SCRIPTS = os.path.dirname(os.path.dirname(LOCATION))

sys.path.append(SCRIPTS)
from webkitpy.common.checkout.diff_parser import DiffParser

def message_from_staged_changelogs():
    try:
        diff = subprocess.check_output(['git', 'diff', '--staged'])
    except subprocess.CalledProcessError:
        return ''

    modified_files = DiffParser(diff.splitlines()).files
    message = ''
    for path, parsed_diff in modified_files.items():
        if not path.endswith('ChangeLog'):
            continue

        # Ignore first line (date, name, email) and second line (empty).
        diff_lines = parsed_diff.lines[2:]

        # Get added lines and strip leading 8 characters indentation.
        lines = [line[2][SPACING:] for line in diff_lines if not line[0]]

        message += '\n'.join(lines)

    return message

def message(source=None, sha=None):
    msg = message_from_staged_changelogs()
    if msg:
        return msg

    dirname = None
    commit_message = []

    try:
        for line in subprocess.check_output(
            ['perl', os.path.join(SCRIPTS, 'prepare-ChangeLog'), '--no-write', '--only-files', '--delimiters'],
            **(dict(encoding='utf-8') if sys.version_info > (3, 0) else dict())
        ).splitlines():
            if line == '~':
                dirname = None
                continue
            if line.startswith(' ' * SPACING):
                if dirname:
                    line = line.replace('* ', '* {}/'.format(dirname))
                commit_message.append(line[SPACING:])
                continue
            if line.endswith(':'):
                dirname = line.split(':')[0]
                continue

        return '''{title}
{bugs}

Reviewed by NOBODY (OOPS!).

{content}
'''.format(
        title=os.environ.get('COMMIT_MESSAGE_TITLE', '') or 'Need a short description (OOPS!).',
        bugs=os.environ.get('COMMIT_MESSAGE_BUG', '') or 'Need the bug URL (OOPS!).',
        content='\n'.join(commit_message) + os.environ.get('COMMIT_MESSAGE_CONTENT', ''),
    )

    except subprocess.CalledProcessError:
        return ''

def main(file_name=None, source=None, sha=None):
    with open(file_name, 'r') as commit_message_file:
        content = commit_message_file.read()

    if source not in (None, 'commit', 'template', 'merge'):
        return 0
    
    if source == 'merge' and not content.startswith('Revert'):
        return 0

    if os.environ.get('GIT_EDITOR', '') == ':':
        # When there's no editor being launched, do nothing.
        return 0

    with open(file_name, 'w') as commit_message_file:
        if sha:
            commit_message_file.write(subprocess.check_output(
                ['git', 'log', 'HEAD', '-1', '--pretty=format:%B'],
                **(dict(encoding='utf-8') if sys.version_info > (3, 5) else dict())
            ))
        else:
            commit_message_file.write(message(source=source, sha=sha))

        commit_message_file.write('''
# Please populate the above commit message. Lines starting
# with '#' will be ignored

''')
        if sha:
            for line in message(source=source, sha=sha).splitlines():
                commit_message_file.write('# {}\n'.format(line))
            commit_message_file.write('\n')
        for line in subprocess.check_output(
            ['git', 'status'],
            **(dict(encoding='utf-8') if sys.version_info > (3, 5) else dict())
        ).splitlines():
            commit_message_file.write('# {}\n'.format(line))

    return 0


if __name__ == '__main__':
    sys.exit(main(*sys.argv[1:]))
