/*
  Copyright (C) 2004 SKYRIX Software AG

  This file is part of OpenGroupware.org.

  OGo 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, or (at your option) any
  later version.

  OGo 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 OGo; see the file COPYING.  If not, write to the
  Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
  02111-1307, USA.
*/
// $Id: SOGoMailAccount.m 274 2004-08-26 13:10:49Z znek $

#include "SOGoMailAccount.h"
#include "SOGoMailFolder.h"
#include "SOGoMailManager.h"
#include "SOGoDraftsFolder.h"
#include "common.h"

@implementation SOGoMailAccount

/* listing the available folders */

- (NSArray *)toManyRelationshipKeys {
  // TODO: hardcoded, if we want to support shared fldrs, this needs to change
  static NSArray *accFolderNames = nil;
  if (accFolderNames == nil) {
    accFolderNames = [[NSArray alloc] initWithObjects:
					@"INBOX", @"Drafts", @"Filters", nil];
  }
  return accFolderNames;
}

/* hierarchy */

- (SOGoMailAccount *)mailAccountFolder {
  return self;
}

- (NSArray *)allFolderPathes {
  NSArray *pathes;

  pathes = [[self mailManager] allFoldersForURL:[self imap4URL] 
			       password:[self imap4Password]];
  pathes = [pathes sortedArrayUsingSelector:@selector(compare:)];
  return pathes;
}

/* IMAP4 */

- (BOOL)useSSL {
  return NO;
}

- (NSURL *)imap4URL {
  /* imap://agenortest@mail.opengroupware.org/INBOX/withsubdirs/subdir1 */
  NSString *s;
  NSRange  r;

  if (self->imap4URL != nil)
    return self->imap4URL;
  
  s = [self nameInContainer];
  r = [s rangeOfString:@"@"];
  if (r.length == 0) {
    [self logWithFormat:@"ERROR: missing login in account folder name: %@", s];
    return nil;
  }

  s = [([self useSSL] ? @"imaps://" : @"imap://") stringByAppendingString:s];
  s = [s stringByAppendingString:@"/"];
  
  self->imap4URL = [[NSURL alloc] initWithString:s];
  return self->imap4URL;
}

/* name lookup */

- (id)lookupFolder:(NSString *)_key ofClassNamed:(NSString *)_cn
  inContext:(id)_cx
{
  Class clazz;

  if ((clazz = NSClassFromString(_cn)) == Nil) {
    [self logWithFormat:@"ERROR: did not find class '%@' for key: '%@'", 
	    _cn, _key];
    return [NSException exceptionWithHTTPStatus:500 /* server error */
			reason:@"did not find mail folder class!"];
  }
  return [[[clazz alloc] initWithName:_key inContainer:self] autorelease];
}

- (id)lookupImap4Folder:(NSString *)_key inContext:(id)_cx {
  return [self lookupFolder:_key ofClassNamed:@"SOGoMailFolder" inContext:_cx];
}
- (id)lookupDraftsFolder:(NSString *)_key inContext:(id)_ctx {
  return [self lookupFolder:_key ofClassNamed:@"SOGoDraftsFolder" 
	       inContext:_ctx];
}
- (id)lookupFiltersFolder:(NSString *)_key inContext:(id)_ctx {
  return [self lookupFolder:_key ofClassNamed:@"SOGoSieveScriptsFolder" 
	       inContext:_ctx];
}

- (id)lookupName:(NSString *)_key inContext:(id)_ctx acquire:(BOOL)_flag {
  id obj;
  
  /* first check attributes directly bound to the application */
  if ((obj = [super lookupName:_key inContext:_ctx acquire:NO]) != nil)
    return obj;
  
  // TODO: those should be product.plist bindings? (can't be class bindings
  //       though because they are 'per-account')
  if ([_key isEqualToString:@"Drafts"]) {
    if ((obj = [self lookupDraftsFolder:_key inContext:_ctx]) != nil)
      return obj;
  }
  if ([_key isEqualToString:@"Filters"]) {
    if ((obj = [self lookupFiltersFolder:_key inContext:_ctx]) != nil)
      return obj;
  }
  
  if ((obj = [self lookupImap4Folder:_key inContext:_ctx]) != nil)
    return obj;
  
  /* return 404 to stop acquisition */
  return [NSException exceptionWithHTTPStatus:404 /* Not Found */];
}

/* WebDAV */

- (BOOL)davIsCollection {
  return YES;
}

- (NSString *)shortTitle {
  NSString *s, *login, *host;
  NSRange r;

  s = [self nameInContainer];
  
  r = [s rangeOfString:@"@"];
  if (r.length > 0) {
    login = [s substringToIndex:r.location];
    host  = [s substringFromIndex:(r.location + r.length)];
  }
  else {
    login = nil;
    host  = s;
  }
  
  r = [host rangeOfString:@"."];
  if (r.length > 0)
    host = [host substringToIndex:r.location];
  
  if ([login length] == 0)
    return host;
  
  return [NSString stringWithFormat:@"%@ (%@)", host, login];
}

- (NSString *)davDisplayName {
  return [self shortTitle];
}

@end /* SOGoMailAccount */
