/*
 controller for performance settings selection

 Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz

 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
 If a copy of the MPL was not distributed with this file, You can obtain one at
 http://mozilla.org/MPL/2.0/.
 */

#import "PerformanceEditorController.h"
#import "ConnectionParams.h"
#import "Utils.h"

@interface PerformanceEditorController (Private)
- (NSString *)keyPathForKey:(NSString *)key;
@end

@implementation PerformanceEditorController

- (id)initWithConnectionParams:(ConnectionParams *)params
{
	return [self initWithConnectionParams:params keyPath:nil];
}

- (id)initWithConnectionParams:(ConnectionParams *)params keyPath:(NSString *)keyPath;
{
	self = [super initWithStyle:UITableViewStyleGrouped];

	if (self)
	{
		_params = [params retain];
		_keyPath = (keyPath != nil ? [keyPath retain] : nil);
	}

	return self;
}

- (void)viewDidLoad
{
	[super viewDidLoad];
	// Do any additional setup after loading the view.
}

- (void)viewDidUnload
{
	[super viewDidUnload];
	// Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
	return YES;
}

- (NSString *)keyPathForKey:(NSString *)key
{
	if (_keyPath)
		return [_keyPath stringByAppendingFormat:@".%@", key];

	return key;
}

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

#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 7;
}

// set section headers
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
	return NSLocalizedString(@"Performance Settings",
	                         @"'Performance Settings': performance settings header");
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
	// get the table view cell
	EditFlagTableViewCell *cell =
	    (EditFlagTableViewCell *)[self tableViewCellFromIdentifier:TableCellIdentifierYesNo];
	NSAssert(cell, @"Invalid cell");

	switch ([indexPath row])
	{
		case 0:
		{
			[[cell label] setText:NSLocalizedString(@"RemoteFX", @"RemoteFX performance setting")];
			[[cell toggle] setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_remotefx"]]];
			break;
		}

		case 1:
		{
			[[cell label] setText:NSLocalizedString(@"GFX", @"GFX performance setting")];
			[[cell toggle] setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_gfx"]]];
			break;
		}

		case 2:
		{
			[[cell label] setText:NSLocalizedString(@"H264", @"H264 performance setting")];
			[[cell toggle] setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_h264"]]];
			break;
		}

		case 3:
		{
			[[cell label] setText:NSLocalizedString(@"Desktop Background",
			                                        @"Desktop background performance setting")];
			[[cell toggle]
			    setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_show_desktop"]]];
			break;
		}

		case 4:
		{
			[[cell label] setText:NSLocalizedString(@"Font Smoothing",
			                                        @"Font smoothing performance setting")];
			[[cell toggle]
			    setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_font_smoothing"]]];
			break;
		}

		case 5:
		{
			[[cell label] setText:NSLocalizedString(@"Desktop Composition",
			                                        @"Desktop composition performance setting")];
			[[cell toggle]
			    setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_desktop_composition"]]];
			break;
		}

		case 6:
		{
			[[cell label] setText:NSLocalizedString(@"Window contents while dragging",
			                                        @"Window Dragging performance setting")];
			[[cell toggle]
			    setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_window_dragging"]]];
			break;
		}

		case 7:
		{
			[[cell label] setText:NSLocalizedString(@"Menu Animation",
			                                        @"Menu Animations performance setting")];
			[[cell toggle]
			    setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_menu_animation"]]];
			break;
		}

		case 8:
		{
			[[cell label]
			    setText:NSLocalizedString(@"Visual Styles", @"Use Themes performance setting")];
			[[cell toggle]
			    setOn:[_params boolForKeyPath:[self keyPathForKey:@"perf_windows_themes"]]];
			break;
		}

		default:
			break;
	}

	[[cell toggle] setTag:GET_TAG_FROM_PATH(indexPath)];
	[[cell toggle] addTarget:self
	                  action:@selector(togglePerformanceSetting:)
	        forControlEvents:UIControlEventValueChanged];
	return cell;
}

#pragma mark -
#pragma mark Action Handlers

- (void)togglePerformanceSetting:(id)sender
{
	UISwitch *valueSwitch = (UISwitch *)sender;

	switch (valueSwitch.tag)
	{
		case GET_TAG(0, 0):
			[_params setBool:[valueSwitch isOn] forKeyPath:[self keyPathForKey:@"perf_remotefx"]];
			break;

		case GET_TAG(0, 1):
			[_params setBool:[valueSwitch isOn] forKeyPath:[self keyPathForKey:@"perf_gfx"]];
			break;

		case GET_TAG(0, 2):
			[_params setBool:[valueSwitch isOn] forKeyPath:[self keyPathForKey:@"perf_h264"]];
			break;

		case GET_TAG(0, 3):
			[_params setBool:[valueSwitch isOn]
			      forKeyPath:[self keyPathForKey:@"perf_show_desktop"]];
			break;

		case GET_TAG(0, 4):
			[_params setBool:[valueSwitch isOn]
			      forKeyPath:[self keyPathForKey:@"perf_font_smoothing"]];
			break;

		case GET_TAG(0, 5):
			[_params setBool:[valueSwitch isOn]
			      forKeyPath:[self keyPathForKey:@"perf_desktop_composition"]];
			break;

		case GET_TAG(0, 6):
			[_params setBool:[valueSwitch isOn]
			      forKeyPath:[self keyPathForKey:@"perf_window_dragging"]];
			break;

		case GET_TAG(0, 7):
			[_params setBool:[valueSwitch isOn]
			      forKeyPath:[self keyPathForKey:@"perf_menu_animation"]];
			break;

		case GET_TAG(0, 8):
			[_params setBool:[valueSwitch isOn]
			      forKeyPath:[self keyPathForKey:@"perf_windows_themes"]];
			break;

		default:
			break;
	}
}

@end
