/*!
  @header FTControlCmdLine
  @abstract Main file of FTControlCmdLine tool
 
  @availability OS X, GNUstep
  @copyright 2004, 2005, 2006 Free Software Foundation, Inc.
  
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library 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
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA

  <pre>
  -------------------------------------------------------------------------
  Modification history

  20.08.06 ola     initial version
  23.08.06 ola     license changed
  -------------------------------------------------------------------------
  </pre>
*/

#include "FTControlCmdLine.h"


@implementation FTControlCmdLine


+ (ECLogger *) log {
  return [ECLogging loggerForContext: @"FTControlCmdLine"];
}


- init {
  self = [super init];
  
  self->login = nil;
  self->passwd = nil;
  self->output = [[ECStandardOutput alloc] init];
  self->cmdListGraphIds = NO;
  self->cmdRemoveGraph = NO;
  
  return self;
}


- (void) dealloc {
  [self->login release];
  [self->passwd release];
  [self->output release];
  
  [super dealloc];
}


- (BOOL) cmdLineArgumentsOK {
  BOOL gotLogin = NO;
  BOOL gotPasswd = NO;
  id arg;
  
  NSEnumerator *arguments = [[[NSProcessInfo processInfo] arguments]
    objectEnumerator];
  
  while( (arg = [arguments nextObject]) ) {
    if( [arg isEqualToString: @"-login"] ) {
      self->login = [arguments nextObject];
      gotLogin = YES;
      continue;
    } else if( [arg isEqualToString: @"-password"] ) {
      self->passwd = [arguments nextObject];
      gotPasswd = YES;
    } else if( [arg isEqualToString: @"-listGraphIds"] ) {
      self->cmdListGraphIds = YES;
    } else if( [arg isEqualToString: @"-removeGraphWithId"] ) {
      self->graphIdToRemove = [arguments nextObject];
      self->cmdRemoveGraph = YES;
    }

  }
  
  return gotLogin && gotPasswd 
    && (self->cmdListGraphIds || self->cmdRemoveGraph);
}


#define _argumentsOverview \
  @"\nCommand line parameters:\n"\
    "\t-configFile <FT config file>\n\t\tFT configuration file\n"\
    "\t-listGraphIds\n\t\tOutputs a list of all available graph identifiers\n"\
    "\t-removeGraphWithId <graph-id>\n\t\tRmeove the graph related to the"\
      " specified identifier\n"\
    "\t-login <adminlogin>\n\t\tlogin account with sufficient rights\n"\
    "\t-password <passwd>\n\t\tpassword of the specified login"
    
- cmdLineArgumentsOverview {
  [self->output writeString:  _argumentsOverview];
  return self;
}


- cmdListAllGraphIds {
  id <FTGraphManager> graphManager;
  id <ECIterator> graphIdIterator;
  
  graphManager = [[self session] graphManager];
  graphIdIterator = [graphManager allGraphIds];
  
  [self->output
    writeString: @"The following graph identifiers have been found:\n"];
    
  while( [graphIdIterator hasNext] ) {
    id <FTId> foundGraphId = [graphIdIterator next];
    
    [self->output 
      writeString: 
        [NSString 
          stringWithFormat: @"\t%@\n", foundGraphId ]];
   }

  return self;
}


- (ECLogger *) log {
  return [FTControlCmdLine log];
}


- cmdRemoveGraph {
  id <FTGraphManager> graphManager;
  id <FTId> graphId;
  
  graphId = [[[self session] defaultObjectToIdMapper]
    mapObject:self->graphIdToRemove];
    
  graphManager = [[self session] graphManager];
  [graphManager removeGraphWithId: graphId];
  
  return self;
}


- run {
  [self startServerUsingLogin: self->login
    usingPassword: self->passwd];
  
  
  if( [[FTControlCmdLine log] isInfoEnabled] ) {
    [[FTControlCmdLine log]
      info: @"Server started. Now checking existence of graph..."];
  }
  
  [self startServerUsingLogin: self->login
    usingPassword: self->passwd];

  if( self->cmdListGraphIds ) {
    [self cmdListAllGraphIds];
  } 
  
  if( self->cmdRemoveGraph ) {
    [self cmdRemoveGraph];
  }
  
  [self closeSessionAndStopServer];
  
  return self;
}
@end


int main( int argc, char *argv[] ) {
  EC_AUTORELEASEPOOL_BEGIN  
  FTControlCmdLine *controlCmdLine;
  
  NSLog( @"FTImport Version %@", FTCONTROLCMDLINE_VERSION );
  controlCmdLine = [[[FTControlCmdLine alloc] init] autorelease];
  
  [FTAbstractTool startTool: controlCmdLine];
  
  EC_AUTORELEASEPOOL_END
  
  exit( 0 );
}
