#!/usr/bin/env python3

from gitz import git_functions
from gitz.commit_indexer import CommitIndexer
from gitz.program import PROGRAM
from gitz.program import git

SUMMARY = 'Edit one or more commits out of history'
USAGE = 'git-snip <id> [<id> ...]'
DANGER = 'Rewrites history!'
HELP = """"
Edit one or more commits IDs out of the current branch by index
or by commit ID

IDs 0, 1, 2, 3... are short for HEAD~0, HEAD~1, HEAD~2, HEAD~3...

This command rewrites history and is only intended for use on private
branches.
"""
EXAMPLES = """
git snip 0
    Same as git reset --hard HEAD~

git snip 1 2
    Remove the two commits HEAD~1 and HEAD~2 but keep HEAD
"""

_HELP_COMMIT_IDS = 'Names of commit_ids to create'


def git_snip():
    args = PROGRAM.args
    git_functions.check_git()

    indexes = []
    errors = []
    dupes = []
    indexer = CommitIndexer()

    for a in args.commit_ids:
        try:
            index = indexer.index(a)
            if index in indexes:
                dupes.append(a)
            else:
                indexes.append(index)
        except Exception:
            errors.append(a)

    if errors:
        PROGRAM.error('Not commit IDs:', *errors)
    if dupes:
        PROGRAM.error('Duplicate IDs:', *dupes)
    if errors or dupes:
        PROGRAM.exit()

    indexes.sort()
    for i in reversed(indexes):
        'HEAD~%s' % i
        git.rebase(('HEAD~%s' % i), '--onto', 'HEAD~%s' % (i + 1))

    s = '' if len(indexes) == 1 else 's'
    ids = ', '.join(str(i) for i in indexes)
    PROGRAM.log.message('Snipped', len(indexes), 'commit%s:' % s, ids)


def add_arguments(parser):
    parser.add_argument('commit_ids', nargs='+', help=_HELP_COMMIT_IDS)


if __name__ == '__main__':
    PROGRAM.start(**globals())
