//
//  HighscoreListController.m
//  Cart Collect
//
//  Created by iD Student Account on 7/20/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "HighscoreListController.h"


@implementation HighscoreListController


#pragma mark -
#pragma mark Initialization

- (id)initWithStyle:(UITableViewStyle)style {
    // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
    self = [super initWithStyle:style];
    if (self) {
        NSMutableArray* highscores = [NSMutableArray arrayWithCapacity:15];
		const char* sqlQuery = "SELECT * FROM highscores ORDER BY score DESC LIMIT 15";
		sqlite3_stmt* compiled_statement;
		
		if (sqlite3_prepare_v2([Cart_CollectAppDelegate database], sqlQuery, -1, &compiled_statement, NULL) == SQLITE_OK)
		{
			while (sqlite3_step(compiled_statement) == SQLITE_ROW)
			{
				NSString* name = [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiled_statement, 1)];
				int score = sqlite3_column_int(compiled_statement, 2);
				
				NSDate* date = nil;
				char* dateStr = (char*)sqlite3_column_text(compiled_statement, 3);
				if (dateStr != NULL)
				{
					NSString* theDate = [NSString stringWithUTF8String:dateStr];
					NSDateComponents* comps = [[NSDateComponents alloc] init];
					[comps setYear:[[theDate substringToIndex:4] intValue]];
					[comps setMonth:[[theDate substringWithRange:NSMakeRange(5, 2)] intValue]];
					[comps setDay:[[theDate substringWithRange:NSMakeRange(8, 2)] intValue]];
					[comps setHour:[[theDate substringWithRange:NSMakeRange(11, 2)] intValue]];
					[comps setMinute:[[theDate substringWithRange:NSMakeRange(14, 2)] intValue]];
					[comps setSecond:[[theDate substringWithRange:NSMakeRange(17, 2)] intValue]];
					date = [[NSCalendar currentCalendar] dateFromComponents:comps];
					date = [date dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]];
                    [comps release];
				}
				
				Highscore* highscore = [[Highscore alloc] initWithName:name score:score date:date];
				[highscores addObject:highscore];
                [highscore release];
			}
		}

		localHighscores = [highscores copy];
		
		navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
		myNavigationItem = [[UINavigationItem alloc] initWithTitle:@"Highscores"];
		UIBarButtonItem* barButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(back)];
		myNavigationItem.leftBarButtonItem = barButton;
        [barButton release];
		
		UISegmentedControl* segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Local", @"Global", nil]];
		segmentedControl.selectedSegmentIndex = 0;
		segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
		[segmentedControl addTarget:self action:@selector(switchLists:) forControlEvents:UIControlEventValueChanged];
		UIBarButtonItem* barButton2 = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl];
        [segmentedControl release];
		myNavigationItem.rightBarButtonItem = barButton2;
        [barButton2 release];
		
		[navigationBar pushNavigationItem:myNavigationItem animated:NO];
		
		showGlobal = NO;
		loadingGlobal = NO;
		
		tableView = [(UITableView*)self.view retain];
		UIView* parentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
		[tableView setFrame:CGRectMake(0, 44, 320, 480-44)];
		[parentView addSubview:navigationBar];
		[parentView addSubview:tableView];
		self.view = parentView;
        [parentView release];
    }
    return self;
}


#pragma mark -
#pragma mark View lifecycle

/*
- (void)viewDidLoad {
    [super viewDidLoad];

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
*/

/*
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
}
*/
/*
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
}
*/
/*
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
}
*/
/*
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
}
*/
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations.
    return YES;
}
*/


#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
	if (showGlobal)
	{
		return [globalHighscores count];
	} else {
		return [localHighscores count];
	}
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
	NSString* cellIdentifier;
    Highscore* highscore;
    
    // Configure the cell...
	if (showGlobal)
	{
		cellIdentifier = [NSString stringWithFormat:@"Global %d", [indexPath row]];
		highscore = [globalHighscores objectAtIndex:[indexPath row]];
	} else {
		cellIdentifier = [NSString stringWithFormat:@"Local %d", [indexPath row]];
		highscore = [localHighscores objectAtIndex:[indexPath row]];
	}
	
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier] autorelease];
    }
	
	cell.textLabel.text = highscore.name;
	
	if (highscore.date != nil)
	{
		NSDate* todayDate = [NSDate date];
		double ti = [highscore.date timeIntervalSinceDate:todayDate];
		ti = ti * -1;
		
		if (ti < 1)
		{
			cell.detailTextLabel.text = @"What is this I don't even";
		} else if (ti < 60)
		{
			cell.detailTextLabel.text = @"Less than a minute ago";
		} else if (ti < 3600)
		{
			int diff = round(ti / 60);
			cell.detailTextLabel.text = [NSString stringWithFormat:@"%d minutes ago", diff];
		} else if (ti < 86400)
		{
			int diff = round(ti / 60 / 60);
			cell.detailTextLabel.text = [NSString stringWithFormat:@"%d hours ago", diff];
		} else {
			NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
			[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
			[dateFormatter setDateStyle:NSDateFormatterLongStyle];
			cell.detailTextLabel.text = [dateFormatter stringFromDate:highscore.date];
            [dateFormatter release];
		}
	}
	
	UILabel* scoreLabel = [[UILabel alloc] init];
	scoreLabel.text = [NSString stringWithFormat:@"%d", highscore.score];
	CGSize labelSize = [scoreLabel.text sizeWithFont:scoreLabel.font constrainedToSize:CGSizeMake(160, 44) lineBreakMode:UILineBreakModeClip];
	scoreLabel.frame = CGRectMake(320-10-labelSize.width, 22-labelSize.height/2, labelSize.width, labelSize.height);
	[cell addSubview:scoreLabel];
    [scoreLabel release];
	
	cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
    return cell;
}


/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the specified item to be editable.
    return YES;
}
*/


/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source.
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
    }   
}
*/


/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
*/


/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}
*/


#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.
    /*
    <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
    */
}


#pragma mark -
#pragma mark Memory management

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    
    // Relinquish ownership any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}

- (void)back
{
	RootViewController* viewController = [[[UIApplication sharedApplication] delegate] viewController];
	[[[[UIApplication sharedApplication] delegate] window] setRootViewController:nil];
    [[[[UIApplication sharedApplication] delegate] window] addSubview:viewController.view];
}

- (void)switchLists:(id)sender
{
	if ([(UISegmentedControl*)sender selectedSegmentIndex] == 0)
	{
		if (loadingGlobal)
		{
			[loadingView removeFromSuperview];
			[self.view addSubview:tableView];
		}
		
		showGlobal = NO;
		[tableView reloadData];
	} else {
		if (globalHighscores == nil)
		{
			loadingGlobal = YES;
			
			loadingView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 480-44)];
			activity = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(150, 228-44, 20, 20)];
			activity.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
			statusText = [[UILabel alloc] initWithFrame:CGRectMake(0, 256-44, 320, 21)];
			statusText.text = @"Downloading highscores...";
			statusText.textAlignment = UITextAlignmentCenter;

			[loadingView addSubview:activity];
			[loadingView addSubview:statusText];
			[loadingView setBackgroundColor:[UIColor whiteColor]];
			[activity startAnimating];
			[tableView removeFromSuperview];
			[self.view addSubview:loadingView];
			
			CLScoreServerRequest* request = [[CLScoreServerRequest alloc] initWithGameName:@"Cart Collect" delegate:self];
			tQueryFlags flags = kQueryFlagIgnore;
			[request requestScores:kQueryAllTime limit:15 offset:0 flags:flags category:@"Classic"];
            [request release];
		} else {
			showGlobal = YES;
			[tableView reloadData];
		}
	}
}

- (void)scoreRequestOk:(id)sender
{
	NSArray* highscores = [sender parseScores];
	NSMutableArray* highscoreTemp = [[NSMutableArray alloc] init];
	
	for (NSDictionary* data in highscores)
	{
		NSString* name = [data objectForKey:@"cc_playername"];
		int score = [[data objectForKey:@"cc_score"] intValue];
		NSDate* date = [NSDate dateWithTimeIntervalSince1970:[[data objectForKey:@"cc_when"] intValue]];
		Highscore* highscore = [[Highscore alloc] initWithName:name score:score date:date];
		[highscoreTemp addObject:highscore];
        [highscore release];
	}
	
	globalHighscores = [highscoreTemp copy];
    [highscoreTemp release];
	
	loadingGlobal = NO;
	[loadingView removeFromSuperview];
	[self.view addSubview:tableView];
	showGlobal = YES;
	[tableView reloadData];
}

- (void)scoreRequestFail:(id)sender
{
	[activity stopAnimating];
	[statusText setText:@"Unable to download highscores."];
}

@end