//
//  NSIndexPath+MPAdditions.m
//  MathKit
//
//  Created by Kim Wittenburg on 23.04.14.
//  Copyright (c) 2014 Kim Wittenburg. All rights reserved.
//

#import "NSIndexPath+MPAdditions.h"



@implementation NSIndexPath (MPAdditions)

- (NSUInteger)firstIndex
{
    return [self indexAtPosition:0];
}


- (NSUInteger)lastIndex
{
    return [self indexAtPosition:self.length-1];
}


- (NSIndexPath *)indexPathByReplacingLastIndexWithIndex:(NSUInteger)anIndex
{
    return [[self indexPathByRemovingLastIndex] indexPathByAddingIndex:anIndex];
}


- (NSIndexPath *)indexPathByRemovingFirstIndex
{
    if (self.length <= 1) {
        return [[NSIndexPath alloc] init];
    }
    NSUInteger indexes[self.length];
    [self getIndexes:indexes];
    NSUInteger newIndexes[self.length-1];
    for (NSUInteger i = 0; i < self.length-1; i++) {
        newIndexes[i] = indexes[i+1];
    }
    return [[NSIndexPath alloc] initWithIndexes:newIndexes length:self.length-1];
}


- (NSIndexPath *)indexPathByPreceedingIndex:(NSUInteger)anIndex
{
    NSUInteger newIndexes[self.length+1];
    newIndexes[0] = anIndex;
    for (NSUInteger i = 0; i < self.length; i++) {
        newIndexes[i+1] = [self indexAtPosition:i];
    }
    return [[NSIndexPath alloc] initWithIndexes:newIndexes length:self.length+1];
}


- (NSIndexPath *)indexPathByIncrementingLastIndex
{
    if (self.length < 1) {
        return [[NSIndexPath alloc] init];
    }
    NSUInteger lastIndex = [self lastIndex];
    lastIndex++;
    return [[self indexPathByRemovingLastIndex] indexPathByAddingIndex:lastIndex];
}

- (NSIndexPath *)indexPathByDecrementingLastIndex
{
    if (self.length < 1) {
        return [[NSIndexPath alloc] init];
    }
    NSUInteger lastIndex = [self lastIndex];
    lastIndex--;
    return [[self indexPathByRemovingLastIndex] indexPathByAddingIndex:lastIndex];
}


- (NSIndexPath *)indexPathByRemovingIndexesFrom:(NSUInteger)from
{
    NSIndexPath *indexPath = [[NSIndexPath alloc] init];
    for (NSUInteger position = 0; position < MIN(from, self.length); position++) {
        indexPath = [indexPath indexPathByAddingIndex:[self indexAtPosition:position]];
    }
    return indexPath;
}


- (NSIndexPath *)indexPathByRemovingIndexesTo:(NSUInteger)to
{
    NSIndexPath *indexPath = [[NSIndexPath alloc] init];
    for (NSUInteger position = to; position < self.length; position++) {
        indexPath = [indexPath indexPathByAddingIndex:[self indexAtPosition:position]];
    }
    return indexPath;
}


- (NSIndexPath *)commonIndexPathWith:(NSIndexPath *)indexPath
{
    NSIndexPath *commonPath = [[NSIndexPath alloc] init];
    NSUInteger length = MIN(self.length, indexPath.length);
    for (NSUInteger position = 0; position < length; position++) {
        NSUInteger selfIndex = [self indexAtPosition:position];
        NSUInteger otherIndex = [indexPath indexAtPosition:position];
        if (selfIndex == otherIndex) {
            commonPath = [commonPath indexPathByAddingIndex:selfIndex];
        } else {
            break;
        }
    }
    return commonPath;
}

@end
