/***************************************************************************

    supportware
    Copyright (C) 2001-2008 by c.holzheuer
    c.holzheuer@sourceworx.org

    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.

***************************************************************************/


#ifndef DDWEBSITE_H
#define DDWEBSITE_H

#include <fstream>
#include <ddconfig.h>
#include <ddthreadmutex.h>
#include <ddwebpage.h>
#include <ddwebserver.h>
#include <ddiobuffer.h>
#include <dditemset.h>
#include <ddwebblock.h>
#include <ddusermanager.h>
#include <ddmailmanager.h>
#include <ddwebrelatedmanager.h>
#include <ddweboverlay.h>
#include <ddformchecker.h>
#include <ddwebredirectmap.h>
#include <ddwebfile.h>
#include <ddusersessionmanager.h>
#include <ddwebgroup.h>
#include <ddwebview.h>
#include <ddwebcategory.h>

using namespace std;


class ddwebconnection;
class ddwebrequest;
class ddwebsite;


typedef ddmapptr<dditemset>     	dditemsetmap;
typedef map<ddstring,ddstringmap> ddstringmapcache;


/// ddwebsite: Eine Domain wie kochen.supportnet.de
/**
	Eingentlich eine Webapplication. Enthält jetzt auch den Krempel aus snsite,
	da diese wegrationalisiert werden soll.
	Wurde früher mit dem groupmanager zusammengelegt.
*/

class ddwebsite : public ddbasenamedobject
{

public:

  ddwebsite();
  virtual ~ddwebsite();

  void          init_site( ddwebserver* parent, const ddstring& basepath, ddstring& aliases );
  virtual void  init_pagelets() = 0;
	
	void 					run_pagelets();
	
  ddwebpage&		lookup_pagelet( const ddstring& name );
  
	bool          website_handle_request( ddwebconnection& connection );
	dd_result			handle_block_render_call( ddwebpage& paglet, dditem& item );
  dditem*       lookup_item( const ddstring& key );
 	ddwebview& 		get_view( const ddstring& key );
 	void					reset_request_counter();
  
  void					log_message( int level, const ddstring& message ) const;
 	bool 					log_debug( const ddstring& message ) const;
	bool 					log_error( const ddstring& message ) const;	
	void 					log_fatal( const ddstring& message ) const;	
 	
	/**
		Mappt die 'alte' group-Id auf die neue
	*/
	
	inline bool translate_group_id( const ddstring& oldid, ddstring& newid )
	{
		// keine remap -> alte gid zurückgeben
		if( _groupidmapper[ oldid ].empty() )
		{
			newid = oldid;
			return false;
		}
		
		newid = _groupidmapper[ oldid ]; 
		return true;
		
	}

	
	inline const ddstring& get_default_page_title() const
  {
  	return _title;
  }
  
  inline void set_title( const ddstring& title )
  {
  	_title = title;
  }
  
  /**
  	Gibt eine Referenz des Webserver-Objekts zurück.
  */

  inline ddwebserver& get_server()
  {
  	return *_parent;
  }
   
  
  /**
  	Gibt eine Referenz auf die Konfiguration zurück.
  	@see ddconfig.
  */

  inline ddconfig& get_config()
  {
  	return _config;
  }


	/**
  	Gibt das "working directory" dieser domain zurück.
  */

  inline const ddstring& get_working_dir() const
  {
  	return _path;
  }


	/**
  	Gibt das HTML-Templateverzeichnis dieser domain zurück.
  */

  inline const ddstring& get_doc_root() const
  {
  	return _docroot;
  }
  

	/**
		Bestalt aus dem site-name (z.B. computer) den namen der datenbank: z.B. sn_computer
	*/
	
	inline ddstring get_db_name() const
  {
  	return "sn_" + get_name() + ".";
  }
  
  
	/**
  	Gibt die Masterdomain zurück.
  */

  inline const ddstring& get_master_domain()
  {
  	return _master_domain;
  }
  
	
	/**
  	Gibt eine Referenz auf den Sessionmanager zurück.
  	@see ddsessionmanager
  */
  
	inline ddusersessionmanager& get_session_manager()
	{
		return _sessionmanager;
	}

	
	/**
  	Gibt eine Referenz auf den Formmanager zurück.
  	@see ddusermanager
  */

  inline ddformmanager& get_form_manager()
  {
  	return _formmanager;
  }
  
	inline ddwebcategorymap& get_category_map()
	{
		return _categorymap;
	}
  
	/**
  	Gibt eine Referenz auf den Mailmanager zurück.
  	@see ddmailmanager
  */

  inline ddmailmanager& get_mail_manager()
  {
  	return _mailmanager;
  }
	
  inline ddwebfilemanager& get_file_manager()
  {
  	return _imagemanager;
  }
  
  
	/**
  	Gibt eine Referenz auf den "See-Also-manager", neue Version,  zurück.
  	Der See-Also Mechanismus, sucht und speichert im Hintergrund verwandte Themen
  	zu einem Thread .
  	@see ddseealsomanager
  */

  inline ddwebrelatedmanager& get_related_manager()
  {
  	return _relatedmanager;
  }	
	
	
	/**
  	Gibt eine Referenz auf das "linkset", zurück.
  	Damit werden stichworte durch links auf artikel ersetzt, etwa 'mail' -> durch faqs/outlook.html
  */

  inline ddweboverlaylinks& get_overlay_links()
  {
  	return _linkmap;
  }	
  
  
	inline ddweboverlayimages& get_overlay_images()
  {
  	return _imagemap;
  }	
  
  
  /**
  	Gibt eine Referenz auf die alias-liste zurück.
  */

  inline ddwebaliasmap& get_alias_map()
  {
  	return _aliasmap;
  }	
  
  
  /**
  	Gibt eine Referenz auf die redirect-liste zurück.
  */

  inline ddwebredirectmap& get_redirect_map()
  {
  	return _redirectmap;
  }	
  
  
  /**
		Gibt eine Referenz auf den Usermanager zurück.
		@see ddwebserver.get_user_manager()
		@see ddusermanager
	*/
	
	inline ddusermanager& get_user_manager()
	{
		return get_server().get_user_manager();
	}	
  
  
  /**
  	Gibt die Übersetzung für den gegebenen
  	Schlüssel zurück. Wird meistens für Werbetags benutzt,
  	z. B.: Das item "sn_ad1:dp_translate:ad1" könnte
  	"http://my.agency.com/campains/sn1.html" ergeben.
  */

  inline const ddstring& get_translation( const ddstring& key )
  {
  	return _translations[key];
  }

	
	/**
		Gibt eine Referenz auf die Pagelet-Map zurück
		@see ddwebpagemap
	*/
	
  inline ddwebpagemap& get_pagelet_map()
  {
  	return _pageletmap;
  }

	
	/**
		Gibt eine Referenz auf die Block-Map zurück
		@see ddwebblock
	*/
	
  inline ddwebblockmap& get_block_map()
  {
  	return _blockmap;
  }
	
	
	/**
		Gibt eine Referenz auf die Table-Map zurück
		@see ddwebviewmap
	*/
	
  inline ddwebviewmap& get_view_map()
  {
  	return _webviews;
  }
  
	
	/**
		Gibt eine Referenz auf den Vote-Cache zurück
	*/
	
  inline ddstringmapcache& get_vote_cache()
  {
  	return _votecache;
  }
  
	
	/**
		Gibt eine Referenz auf den Group-Manager zurück
		@see ddwebgroupmgr
	*/
	
  
  inline ddwebgroupmgr& get_groups()
  {
  	return _webgroupmgr;
  }

	/**
		Datenblöcke (wie die Zensurliste, Blocklisten etc) aus der DB
		Holen und speichern.
	*/
	
	void fetch_data_entry( const ddstring& key, ddstring& target );
	void store_data_entry( const ddstring& key, const ddstring& value );
	
	// FIX! DAS HAT HIER JA GAR NIX VERLOREN!
	// DAS GEHÖRT IN DEN RENDERER!
  static void create_user_link( dditem& entry, const ddstring& id, const ddstring& nickname );
  			 void create_user_link( dditem& entry, const ddstring& id );
  
  ddstring 		create_passwd();
	
	
	//----------- groupmanager ---------------------
		
	
	virtual bool is_group_valid( int grpid ) = 0;
	
	
	//----------- snsite ---------------------
	
	ddstring& 			get_user_content_count();
	
protected:
	
	virtual ddwebpage*			lookup_pagelet( ddwebrequest& request );  
	  
	virtual ddstring 				localize_path( ddwebrequest& request );

	ddwebserver*	   				_parent;	
	dddataconnection*				_connection;
	ddconfig	       				_config;
	 
	// FIX! eigentlich sind das DIR_INFOS
  ddstring	       				_path;
  ddstring	       				_docroot;
  ddstring	       				_master_domain;
	ddstring   		 					_title;
	
	ddusersessionmanager 		_sessionmanager;
  ddmailmanager    				_mailmanager;
  ddwebfilemanager				_imagemanager;					
  ddwebrelatedmanager			_relatedmanager;
  ddweboverlaylinks				_linkmap;
  ddweboverlayimages			_imagemap;
  ddwebaliasmap						_aliasmap;
  ddwebredirectmap				_redirectmap;	
	ddformmanager 					_formmanager;
	dditemsetmap     				_itemsets; 
	ddwebviewmap						_webviews;
	ddwebpagemap     				_pageletmap;
	ddwebgroupmgr						_webgroupmgr;
	ddwebblockmap						_blockmap;	
	ddstringmapcache 				_votecache;
	ddstringmap				 			_translations;
  ddthreadmutex						_tablelock;
  ddthreadmutex						_pageletlock;
  ddthreadmutex 					_dataentrylock;
  
  ddstringrowset					_blockedips;
	ddstringmap							_groupidmapper;

protected: // snsite
	
	ddstring   		 					_archivebox;
  ddstring   		 					_contentcount;
  ddthreadmutex   				_contentmutex;
	
	ddwebcategorymap 	_categorymap;
	
private:

  ddwebsite( const ddwebsite& src );
  ddwebsite& operator=( const ddwebsite& src );

};



#endif
