/* $Id$ */
/* 
 * Copyright (C) 2010-2011 Teluu Inc. (http://www.teluu.com)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
#import "RootViewController.h"
#import "gui.h"
#import "systest.h"

/* Sleep interval duration, change to shorter duration for better
 * interaction but make sure there is enough time for the other
 * thread to do what it's supposed to do
 */
#define SLEEP_INTERVAL 0.5

@implementation RootViewController
@synthesize titles;
@synthesize menus;
@synthesize testView;

RootViewController	*view;

bool			systest_initialized;
bool			thread_quit;
gui_menu		*gmenu;
int			section;
int			row;
const char		*ctitle;
const char		*cmsg; 
enum gui_flag		cflag;

pj_status_t gui_init(gui_menu *menu)
{
    PJ_UNUSED_ARG(menu);
    return PJ_SUCCESS;
}

/* Run GUI main loop */
pj_status_t gui_start(gui_menu *menu)
{
    view.titles = [NSMutableArray arrayWithCapacity:menu->submenu_cnt];
    view.menus = [NSMutableArray arrayWithCapacity:menu->submenu_cnt];
    NSMutableArray *smenu;
    for (int i = 0; i < menu->submenu_cnt; i++) {
	NSString *str = [NSString stringWithFormat:@"%s" , menu->submenus[i]->title];
	[view.titles addObject: str];
	smenu = [NSMutableArray arrayWithCapacity:menu->submenus[i]->submenu_cnt];
	/* We do not need the last two menus of the "Tests" menu (NULL and "Exit"),
	 * so subtract by 2
	 */
	for (int j = 0; j < menu->submenus[i]->submenu_cnt - (i==0? 2: 0); j++) {
	    str = [NSString stringWithFormat:@"%s" , menu->submenus[i]->submenus[j]->title];
	    [smenu addObject:str];
	}
	[view.menus addObject:smenu];
    }
    gmenu = menu;
    
    return PJ_SUCCESS;
}

/* Signal GUI mainloop to stop */
void gui_destroy(void)
{
}

/* AUX: display messagebox */
enum gui_key gui_msgbox(const char *title, const char *message, enum gui_flag flag)
{
    ctitle = title;
    cmsg = message;
    cflag = flag;
    [view performSelectorOnMainThread:@selector(showMsg) withObject:nil waitUntilDone:YES];
    
    view.testView.key = 0;
    while(view.testView.key == 0) {
	/* Let the main thread do its job (refresh the view) while we wait for 
	 * user interaction (button click)
	 */
	[NSThread sleepForTimeInterval:SLEEP_INTERVAL];
    }
    
    if (view.testView.key == 1)
	return KEY_OK;
    else
	return (flag == WITH_YESNO? KEY_NO: KEY_CANCEL);
}

/* AUX: sleep */
void gui_sleep(unsigned sec)
{
    [NSThread sleepForTimeInterval:sec];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    view = self;
    
    /* Get a writable path for output files */
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    [documentsDirectory getCString:doc_path maxLength:PATH_LENGTH encoding:NSASCIIStringEncoding];
    strncat(doc_path, "/", PATH_LENGTH);

    /* Get path for our test resources (the wav files) */
    NSString *resPath = [[NSBundle mainBundle] resourcePath];
    [resPath getCString:res_path maxLength:PATH_LENGTH encoding:NSASCIIStringEncoding];
    strncat(res_path, "/", PATH_LENGTH);
    
    systest_initialized = false;
    thread_quit = false;
    [NSThread detachNewThreadSelector:@selector(startTest) toTarget:self withObject:nil];
    /* Let our new thread initialize */
    while (!systest_initialized) {
	[NSThread sleepForTimeInterval:SLEEP_INTERVAL];
    }

    // 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 (interfaceOrientation == UIInterfaceOrientationPortrait);
 }
 */

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

- (void)viewDidUnload {
    // Release anything that can be recreated in viewDidLoad or on demand.
    // e.g. self.myOutlet = nil;
    self.titles = nil;
    self.menus = nil;
    
    thread_quit = true;
    [NSThread sleepForTimeInterval:SLEEP_INTERVAL];
}


#pragma mark Table view methods


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [titles count];
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [[menus objectAtIndex:section] count];
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    // The header for the section is the region name -- get this from the region at the section index.
    return [titles objectAtIndex:section];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    
    // Configure the cell.
    cell.textLabel.text = [[menus objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    
    return cell;
}

- (void)startTest {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    if (systest_init() != PJ_SUCCESS) {
	[pool release];
	return;
    }
    
    systest_run();
    
    systest_initialized = 1;
    while(!thread_quit) {
	section = -1;
	while (section == -1) {
	    [NSThread sleepForTimeInterval:SLEEP_INTERVAL];
	}
	(*gmenu->submenus[section]->submenus[row]->handler)();
	cmsg = NULL;
	[view performSelectorOnMainThread:@selector(showMsg) withObject:nil waitUntilDone:YES];
    }
    
    systest_deinit();
    [pool release];
}

- (void)showMsg {
    if (cmsg == NULL) {
	self.testView.testDesc.text = [self.testView.testDesc.text stringByAppendingString: @"Finished"];
	[self.testView.testDesc scrollRangeToVisible:NSMakeRange([self.testView.testDesc.text length] - 1, 1)];
	[self.testView.button1 setHidden:true];
	[self.testView.button2 setHidden:true];
	return;
    }
    self.testView.title = [NSString stringWithFormat:@"%s", ctitle];
    self.testView.testDesc.text = [self.testView.testDesc.text stringByAppendingString: [NSString stringWithFormat:@"%s\n\n", cmsg]];
    [self.testView.testDesc scrollRangeToVisible:NSMakeRange([self.testView.testDesc.text length] - 1, 1)];
    
    [self.testView.button1 setHidden:false];
    [self.testView.button2 setHidden:false];
    if (cflag == WITH_YESNO) {
	[self.testView.button1 setTitle:@"Yes" forState:UIControlStateNormal];
	[self.testView.button2 setTitle:@"No" forState:UIControlStateNormal];
    } else if (cflag == WITH_OK) {
	[self.testView.button1 setTitle:@"OK" forState:UIControlStateNormal];
	[self.testView.button2 setHidden:true];
    } else if (cflag == WITH_OKCANCEL) {
	[self.testView.button1 setTitle:@"OK" forState:UIControlStateNormal];
	[self.testView.button2 setTitle:@"Cancel" forState:UIControlStateNormal];
    }
}


// Override to support row selection in the table view.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
    // Navigation logic may go here -- for example, create and push another view controller.
    // AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
    // [self.navigationController pushViewController:anotherViewController animated:YES];
    // [anotherViewController release];
    
    if (self.testView == nil) {
	self.testView = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:[NSBundle mainBundle]];
    }
    
    [self.navigationController pushViewController:self.testView animated:YES];
    self.testView.title = [[menus objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    self.testView.testDesc.text = @"";
    section = indexPath.section;
    row = indexPath.row;
}


/*
 // 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;
 }
 */


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


@end

