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

    supportware
    Copyright (C) 2001-2010 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.

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


#include <sxpagepager.h>
#include <dditemset.h>
#include <dditemlink.h>
#include <ddwebconnection.h>


/**
	Default Constructor.
*/

sxpagepager::sxpagepager( const ddstring& name, ddwebsite* site )
: sxpage( name, site, "per&ouml;nliche Nachrichten" )
{
	
 	add_request_handler( "pager",				 			"xx_pager_overview",		(ddmemptr) &sxpagepager::on_overview );
	add_request_handler( "on_create",					"xx_pager_create",			(ddmemptr) &sxpagepager::on_create );
	add_request_handler( "on_reply_create",		"xx_pager_overview",		(ddmemptr) &sxpagepager::on_reply_create, 2 );
	add_request_handler( "on_remove",					"xx_pager_overview",		(ddmemptr) &sxpagepager::on_remove );
	
	add_inner_call( 		 "sn_box_members_contacts",		(ddmemptr) &sxpagepager::create_box_contacts );


	context.pagetype = "pager";
	
}


/**
	Innercall, der die 'Kontakte'-Box rendert.
*/

dd_result sxpagepager::create_box_contacts( dditem& item )
{
	item.clear_children();
	
	ddwebview& table = get_view( "sxpagepager.contacts" );
	dditem& block = item["sn_msgentry"];
	item.clear_children();	
	// fill ist hoffentlich schon passiert !?
	//if( table.fill( "pager_contacts", get_user_id().get_id() ) > 0 )
	if( table.size() > 0 )
		table.on_render( *this, block );
	else
		block.from_string( "Sie haben noch keine Kontakte." );

	get_buffer().append( item.to_string() );
	
	return rs_ok;
	
}


/**
 	Die Pager-Seite anzeigen, Design ala iPhone
 	Links werden 'aktive Kontakte', also Empfänger und Absender von meinen
 	PMs, als Liste angezeigt, im Body dann die Kommunikation mit einem
 	Partner in ihrer zeitlichen Abfolge.
*/

dd_result sxpagepager::on_overview( dditem& item )
{

	// shortcuts
	dduserid& user = get_user_id();
	const ddstring& uid = user.get_id();
	ddwebview& table = get_view();
	dditem& body = get_body()["sn_content"];
	
	if( user.is_guest() )
		return create_login_message();	

	//			
	// Teil 1: kontakte holen, auch nötig für die kontakte-box
	//
	ddwebview& contacts = get_view( "sxpagepager.contacts" );	
	contacts.fill( "pager_contacts", get_user_id().get_id() );

	//			
	// Teil 2: Die Messages rendern
	//
			
	// erstmal alles hübsch machen
	body.clear_value();
	
	// wenn kein kontakt geklickt wurde, nehmen wir den ersten
	
	ddstring idcontact;
	if( get_split_path().size() > 1 )
	 idcontact = get_split_path()[1];
	else if ( contacts.size() > 0 )
		idcontact = contacts[0]["id_user"];
	
	dditem& msgentry = body["sn_msgentry"];		
	if( idcontact.empty() )	
		return create_hint_box( body, DDHINTNOMESSAGE ); 
	
	const ddstring& nickcontact = get_user_manager().get_nick_name( idcontact );
  body["sn_contact1"].from_string( nickcontact );
  body["sn_contact2"].from_string( nickcontact );
  
  body["id_contact1"].from_string( idcontact );
  body["id_contact2"].from_string( idcontact );
 	body["xx_block_options"]["id_user1"].from_string( idcontact );
 
	msgentry.clear_value();
	
	// wir rendern zwar den navigator, da aber 99.9% der Leute weniger als
	// 10 messages pro contact haben, wird die DB-Abfrage _nicht_ mit limit x,y
	// geregelt.
	
	// block ermitteln
	context.navipage = get_split_path().size() > 2 ? get_split_path()[2].as_int() : 0 ;
	context.itemspp =  user.get_items_per_page();
 	// ausschnitt ermitteln
 	context.navifrom = context.navipage * context.itemspp;
	context.navito   = context.navifrom + context.itemspp;
 	// linkbase ermitteln
 	context.navilinkbase = "/pager/" + idcontact + "/";
 	
	// und ab
	context.numrows = table.fill( "pager_postbox", uid, idcontact );			
	// ...testen...
	if( context.numrows <= 0 )
		return create_hint_box( body, DDHINTNOMESSAGE );	
	
	// nur den 'virtuellen' Ausschnitt rendern
	table.on_render( *this, msgentry, context.navifrom, context.navito );	
	
	return rs_ok;

	(void) item;

}


/**
	Einen neuen Kontakt anlegen, in dem eine Message an diesen 
	verschickt wird.
*/

dd_result sxpagepager::on_create( dditem& item )
{
	
	//
	// Teil 1: Erst die Absender- bzw. Kontaktliste rendern	
	//
	ddformmanager& mgr = get_site().get_form_manager();		
	
	ddwebcgi& cgi = get_cgi();
	dduserid& uid = get_user_id();
	dditem& body = get_body()["sn_content"];
	
	const ddstring& recv = cgi["sn_nickreceiver"];
	// erster versuch: form säubern und anzeigen
	if( recv.empty() && cgi["sn_msgbody"].empty() )
	{
		body.clear_children();
		return rs_ok;
	}
	
	// im fehlerfall:
	if( !mgr.check_form( "check.pager_create", body, uid, cgi ) || mgr.contains_blocked_words() )
		return rs_ok;
	
	// und ab
	ddmailmanager& mm  = get_site().get_mail_manager();		
	get_user_manager().send_pager_message( uid, recv, cgi, mm );
	const ddstring& newid = get_user_manager()[ recv.as_lower() ].get_id();
	// FIX! ans Ende springen
	return create_redirect( "/pager/" + newid );

}


/**
	Eine neue Message in den 'Kontakt-Thread' schreiben.
*/

dd_result sxpagepager::on_reply_create( dditem& item )
{
	
	// diesmal halten wir uns an den standard-ablauf,
	// die id ist bereits vorhanden, jetzt muss nur noch 
	// der msgbody getestet werden.
	dditem& body = get_body()["sn_content"];

	// gibbet den user ?
	ddusermanager& usrmgr = get_user_manager();
	
	//const ddstring& recvid	 = get_split_path()[1];
	const ddstring& recvnick = usrmgr.get_nick_name( get_split_path()[1] );
	if( recvnick.empty() )
		return create_hint_box( body, "member nicht gefunden: --" );
	
	ddformmanager& mgr = get_site().get_form_manager();
		
	ddwebcgi& cgi = get_cgi();
	dduserid& uid = get_user_id();
	
	// im fehlerfall:
	if( !mgr.check_form( "check.pager_reply",body, uid, cgi ) || mgr.contains_blocked_words() )
		return on_overview( item );
	
	// und ab
	ddmailmanager& mm  = get_site().get_mail_manager();		
	usrmgr.send_pager_message( uid, recvnick, cgi, mm );
	
	return create_redirect( get_jump_last_url() + "#createreply" );
	
}


/**
	Ein Pagermessage löschen
*/

dd_result sxpagepager::on_remove( dditem& item )
{
 	
 	ddwebview& table = get_view();
 	
 	//
 	//	Ja, das ist ein Datenleck!
 	//	FIX! prüfen via Context.ID != get_id(); oder sowas
 	//
 	
 	bool is_sender = get_cgi()["sender"].empty();
	table.execute( "on_remove", is_sender ? "receiver" : "sender" , get_cgi()["id"] );

 	return create_redirect( get_full_path() );

	(void) item;

}























