// Copyright (c) 2013 Mutual Mobile (http://mutualmobile.com/)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

#import "MMViewController.h"
#import "CustomMMSpreadsheetView.h"
#import "MMGridCell.h"
#import "MMTopRowCell.h"
#import "MMLeftColumnCell.h"
#import "NSIndexPath+MMSpreadsheetView.h"

@interface MMViewController () <MMSpreadsheetViewDataSource, MMSpreadsheetViewDelegate>

@property (nonatomic, strong) NSMutableSet *selectedGridCells;
@property (nonatomic, strong) NSString *cellDataBuffer;
@property (nonatomic, strong) CustomMMSpreadsheetView *spreadSheetView;


@end

@implementation MMViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSUInteger rows = 4;
    NSUInteger cols = 4;
    
    // Create some fake grid data for the demo.
    self.tableData = [NSMutableArray array];
    
    for (NSUInteger rowNumber = 0; rowNumber < rows; rowNumber++) {
        NSMutableArray *row = [NSMutableArray array];
        for (NSUInteger columnNumber = 0; columnNumber < cols; columnNumber++) {
            [row addObject:@""];
        }
        [self.tableData addObject:row];
    }
    
    self.selectedGridCells = [NSMutableSet set];
    
    // Create the spreadsheet in code.
    CustomMMSpreadsheetView *spreadSheetView = [[CustomMMSpreadsheetView alloc] initWithNumberOfHeaderRows:1 numberOfHeaderColumns:1 frame:self.view.bounds];
    self.spreadSheetView = spreadSheetView;
    spreadSheetView.tableData = self.tableData;
    spreadSheetView.bounces = NO;
    spreadSheetView.backgroundColor = [UIColor whiteColor];
    // Register your cell classes.
    [spreadSheetView registerCellClass:[MMGridCell class] forCellWithReuseIdentifier:@"GridCell"];
    [spreadSheetView registerCellClass:[MMTopRowCell class] forCellWithReuseIdentifier:@"TopRowCell"];
    [spreadSheetView registerCellClass:[MMTopRowCell class] forCellWithReuseIdentifier:@"BottomRowCell"];
    [spreadSheetView registerCellClass:[MMLeftColumnCell class] forCellWithReuseIdentifier:@"LeftColumnCell"];

    // Set the delegate & datasource for the spreadsheet view.
    spreadSheetView.delegate = self;
    spreadSheetView.dataSource = self;
    
    // Add the spreadsheet view as a subview.
    [self.view addSubview:spreadSheetView];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - MMSpreadsheetViewDataSource

- (CGSize)spreadsheetView:(CustomMMSpreadsheetView *)spreadsheetView sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat leftColumnWidth = 120.0f;
    CGFloat topRowHeight = 60.0f;
    CGFloat gridCellWidth = 100;
    CGFloat gridCellHeight = 50.0f;

    // Upper left.
    if (indexPath.mmSpreadsheetRow == 0 && indexPath.mmSpreadsheetColumn == 0) {
        return CGSizeMake(leftColumnWidth, topRowHeight);
    }
    
    // Upper right.
    if (indexPath.mmSpreadsheetRow == 0 && indexPath.mmSpreadsheetColumn > 0) {
        return CGSizeMake(gridCellWidth, topRowHeight);
    }
    
    // Lower left.
    if (indexPath.mmSpreadsheetRow > 0 && indexPath.mmSpreadsheetColumn == 0) {
        return CGSizeMake(leftColumnWidth, gridCellHeight);
    }
    
    return CGSizeMake(gridCellWidth, gridCellHeight);
}

- (NSInteger)numberOfRowsInSpreadsheetView:(CustomMMSpreadsheetView *)spreadsheetView {
    NSInteger rows = [self.tableData count];
    return rows;
}

- (NSInteger)numberOfColumnsInSpreadsheetView:(CustomMMSpreadsheetView *)spreadsheetView {
    NSArray *rowData = [self.tableData lastObject];
    NSInteger cols = [rowData count];
    return cols;
}

- (UICollectionViewCell *)spreadsheetView:(CustomMMSpreadsheetView *)spreadsheetView cellForItemAtIndexPath:(NSIndexPath *)indexPath collectionView:(UICollectionView *)collectionView{
    UICollectionViewCell *cell = nil;
    if (indexPath.mmSpreadsheetRow == 0 && indexPath.mmSpreadsheetColumn == 0) {
        // Upper left.
        cell = [spreadsheetView dequeueReusableCellWithReuseIdentifier:@"GridCell" forIndexPath:indexPath];
//        NSLog(@"顶部左边 %p",cell);
//        NSLog(@"clumn %lu row %lu", indexPath.mmSpreadsheetColumn, indexPath.mmSpreadsheetRow);
        MMGridCell *gc = (MMGridCell *)cell;
        NSArray *colData = [self.tableData objectAtIndex:indexPath.mmSpreadsheetRow];
        NSString *rowData = [colData objectAtIndex:indexPath.mmSpreadsheetColumn];
        gc.textLabel.text = rowData;
        gc.textLabel.numberOfLines = 0;
        cell.backgroundColor = [UIColor colorWithRed:0.996 green:0.976 blue:0.953 alpha:1.000];
    }
    else if (indexPath.mmSpreadsheetRow == 0 && indexPath.mmSpreadsheetColumn > 0 && collectionView.tag != MMSpreadsheetViewCollectionBottom) {
        // Upper right. 顶部那一行
        cell = [spreadsheetView dequeueReusableCellWithReuseIdentifier:@"TopRowCell" forIndexPath:indexPath];
//        NSLog(@"顶部右边 %p",cell);
//        NSLog(@"clumn %lu row %lu", indexPath.mmSpreadsheetColumn, indexPath.mmSpreadsheetRow);
        MMTopRowCell *tr = (MMTopRowCell *)cell;
        NSArray *colData = [self.tableData objectAtIndex:indexPath.mmSpreadsheetRow];
        NSString *rowData = [colData objectAtIndex:indexPath.mmSpreadsheetColumn];
        tr.textLabel.text = rowData;
        if (indexPath.mmSpreadsheetColumn == 1) {
            tr.textLabel.textColor = [UIColor redColor];
        }else{
            tr.textLabel.textColor = [UIColor blackColor];
        }
        tr.textLabel.numberOfLines = 2;
        cell.backgroundColor = [UIColor colorWithRed:0.996 green:0.976 blue:0.953 alpha:1.000];
    }
    else if (indexPath.mmSpreadsheetRow > 0 && indexPath.mmSpreadsheetColumn == 0) {
        // Lower left.
        cell = [spreadsheetView dequeueReusableCellWithReuseIdentifier:@"LeftColumnCell" forIndexPath:indexPath];
        NSLog(@"左栏 %p", cell);
        NSLog(@"clumn %lu row %lu", indexPath.mmSpreadsheetColumn, indexPath.mmSpreadsheetRow);
        MMLeftColumnCell *lc = (MMLeftColumnCell *)cell;
        NSArray *colData = [self.tableData objectAtIndex:indexPath.mmSpreadsheetRow];
        NSString *rowData = [colData objectAtIndex:indexPath.mmSpreadsheetColumn];
        lc.textLabel.text = rowData;
        BOOL isDarker = indexPath.mmSpreadsheetRow % 2 == 0;
        if (isDarker) {
            cell.backgroundColor = [UIColor colorWithRed:222.0f / 255.0f green:243.0f / 255.0f blue:250.0f / 255.0f alpha:1.0f];
        } else {
            cell.backgroundColor = [UIColor colorWithRed:233.0f / 255.0f green:247.0f / 255.0f blue:252.0f / 255.0f alpha:1.0f];
        }
    }
    else  if (indexPath.mmSpreadsheetRow > 0 && indexPath.mmSpreadsheetColumn > 0 && indexPath.mmSpreadsheetRow < self.tableData.count - 1 ) {
        // Lower right.
        cell = [spreadsheetView dequeueReusableCellWithReuseIdentifier:@"GridCell" forIndexPath:indexPath];
        NSLog(@"LR %p",cell);
        NSLog(@"clumn %lu row %lu", indexPath.mmSpreadsheetColumn, indexPath.mmSpreadsheetRow);
        MMGridCell *gc = (MMGridCell *)cell;
        NSArray *colData = [self.tableData objectAtIndex:indexPath.mmSpreadsheetRow];
        NSString *rowData = [colData objectAtIndex:indexPath.mmSpreadsheetColumn];
        gc.textLabel.text = rowData;
        if (indexPath.mmSpreadsheetColumn == 1) {
            gc.textLabel.textColor = [UIColor redColor];
        }else{
            gc.textLabel.textColor = [UIColor blackColor];
        }
        BOOL isDarker = indexPath.mmSpreadsheetRow % 2 == 0;
        if (isDarker) {
            cell.backgroundColor = [UIColor colorWithRed:242.0f / 255.0f green:242.0f / 255.0f blue:242.0f / 255.0f alpha:1.0f];
        } else {
            cell.backgroundColor = [UIColor colorWithRed:250.0f / 255.0f green:250.0f / 255.0f blue:250.0f / 255.0f alpha:1.0f];
        }
    }else{
        cell = [spreadsheetView dequeueReusableCellWithReuseIdentifier:@"BottomRowCell" forIndexPath:indexPath];
        NSLog(@"BR %p",cell);
        NSLog(@"clumn %lu row %lu", indexPath.mmSpreadsheetColumn, indexPath.mmSpreadsheetRow);
        MMTopRowCell *tr = (MMTopRowCell *)cell;
        NSArray *colData = [self.tableData lastObject];
        NSString *rowData = [colData objectAtIndex:indexPath.mmSpreadsheetColumn];
        tr.textLabel.text = rowData;
        if (indexPath.mmSpreadsheetColumn == 1) {
            tr.textLabel.textColor = [UIColor redColor];
        }else{
            tr.textLabel.textColor = [UIColor blackColor];
        }
        cell.backgroundColor = [UIColor whiteColor];
    }

    return cell;
}

#pragma mark - MMSpreadsheetViewDelegate

- (void)spreadsheetView:(CustomMMSpreadsheetView *)spreadsheetView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    if ([self.selectedGridCells containsObject:indexPath]) {
        [self.selectedGridCells removeObject:indexPath];
        [spreadsheetView deselectItemAtIndexPath:indexPath animated:YES];
    } else {
        [self.selectedGridCells removeAllObjects];
        [self.selectedGridCells addObject:indexPath];
    }
}

- (BOOL)spreadsheetView:(CustomMMSpreadsheetView *)spreadsheetView shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (BOOL)spreadsheetView:(CustomMMSpreadsheetView *)spreadsheetView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
    
    /*
     These are the selectors the sender (a UIMenuController) sends by default.
     
     _insertImage:
     cut:
     copy:
     select:
     selectAll:
     paste:
     delete:
     _promptForReplace:
     _showTextStyleOptions:
     _define:
     _addShortcut:
     _accessibilitySpeak:
     _accessibilitySpeakLanguageSelection:
     _accessibilityPauseSpeaking:
     makeTextWritingDirectionRightToLeft:
     makeTextWritingDirectionLeftToRight:
     
     We're only interested in 3 of them at this point
     */
    if (action == @selector(cut:) ||
        action == @selector(copy:) ||
        action == @selector(paste:)) {
        return YES;
    }
    return NO;
}

- (void)spreadsheetView:(CustomMMSpreadsheetView *)spreadsheetView performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
    NSMutableArray *rowData = [self.tableData objectAtIndex:indexPath.mmSpreadsheetRow];
    if (action == @selector(cut:)) {
        self.cellDataBuffer = [rowData objectAtIndex:indexPath.row];
        [rowData replaceObjectAtIndex:indexPath.row withObject:@""];
        [spreadsheetView reloadData];
    } else if (action == @selector(copy:)) {
        self.cellDataBuffer = [rowData objectAtIndex:indexPath.row];
    } else if (action == @selector(paste:)) {
        if (self.cellDataBuffer) {
            [rowData replaceObjectAtIndex:indexPath.row withObject:self.cellDataBuffer];
            [spreadsheetView reloadData];
        }
    }
}

- (void)reloadData {
    [self.spreadSheetView reloadData];
}
@end