/*
 Controller to edit bookmark credentials
 
 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 "CredentialsEditorController.h"
#import "Bookmark.h"
#import "Utils.h"

@interface CredentialsEditorController ()

@end

#define SECTION_CREDENTIALS 0
#define SECTION_COUNT 1

@implementation CredentialsEditorController

- (id)initWithBookmark:(ComputerBookmark*)bookmark
{
    if ((self = [super initWithStyle:UITableViewStyleGrouped])) 
	{
		// set additional settings state according to bookmark data
		_bookmark = [bookmark retain];
        _params = [bookmark params];        
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setTitle:NSLocalizedString(@"Credentials", @"Credentials title")];
}

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

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    
    // foce any active editing to stop
    [[self view] endEditing:NO];
}

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

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

#pragma mark -
#pragma mark Table view data source

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


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
	switch (section)
	{
		case SECTION_CREDENTIALS: // credentials
			return 3;
		default:
			break;
	}
	
    return 0;
}


// set section headers
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
	switch(section)
	{
		case SECTION_CREDENTIALS:
			return NSLocalizedString(@"Credentials", @"'Credentials': credentials settings header");
	}
	return @"unknown";
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
	// determine the required cell type
	NSString* cellType = nil;
	switch([indexPath section])
	{
		case SECTION_CREDENTIALS: // credentials
			if([indexPath row] == 1)
                cellType = TableCellIdentifierSecretText; // password field
            else
                cellType = TableCellIdentifierText;
			break;
                        
        default:
            break;
	}	
	NSAssert(cellType != nil, @"Couldn't determine cell type");	
	
	// get the table view cell
	UITableViewCell *cell = [self tableViewCellFromIdentifier:cellType];
	NSAssert(cell, @"Invalid cell");	
    
	// set cell values
	switch([indexPath section]) 
	{			
            // credentials
		case SECTION_CREDENTIALS:
			[self initCredentialSettings:indexPath cell:cell];
			break;            
            
		default:
			break;
	}	
    
    return cell;
}


// updates credentials in the UI
- (void)initCredentialSettings:(NSIndexPath*)indexPath cell:(UITableViewCell*)cell
{
	switch(indexPath.row) 
	{
		case 0:
        {
            EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell;
            [[textCell textfield] setTag:GET_TAG_FROM_PATH(indexPath)];
            [[textCell label] setText:NSLocalizedString(@"Username", @"'Username': Bookmark username")];
			[[textCell textfield] setText:[_params StringForKey:@"username"]];
            [[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")];
			break;            
        }
		case 1:
        {
            EditSecretTextTableViewCell* textCell = (EditSecretTextTableViewCell*)cell;
            [[textCell textfield] setTag:GET_TAG_FROM_PATH(indexPath)];            
			[[textCell label] setText:NSLocalizedString(@"Password", @"'Password': Bookmark password")];
			[[textCell textfield] setText:[_params StringForKey:@"password"]];
            [[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")];
			break;
        }
		case 2:
        {
            EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell;
            [[textCell textfield] setTag:GET_TAG_FROM_PATH(indexPath)];
			[[textCell label] setText:NSLocalizedString(@"Domain", @"'Domain': Bookmark domain")];
			[[textCell textfield] setText:[_params StringForKey:@"domain"]];
            [[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")];
			break;            
        }
		default:
			NSLog(@"Invalid row index in settings table!");
			break;
	}    
}

#pragma mark -
#pragma mark Text Field delegate

- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
	[textField resignFirstResponder];
	return NO;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
	switch(textField.tag)
	{            
            // update credentials settings
		case GET_TAG(SECTION_CREDENTIALS, 0):
			[_params setValue:[textField text] forKey:@"username"];
			break;
            			
		case GET_TAG(SECTION_CREDENTIALS, 1):
			[_params setValue:[textField text] forKey:@"password"];
			break;

		case GET_TAG(SECTION_CREDENTIALS, 2):
			[_params setValue:[textField text] forKey:@"domain"];
			break;
            
		default:
			break;
	}
	return YES;
}

@end
