#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <clib/exec_protos.h>
#include <proto/exec.h>
#include <exec/exec.h>
#include <exec/memory.h>
#include <clib/dos_protos.h>
#include <proto/dos.h>
#include <dos/dos.h>

#include "sc:autopoint_lib/autopoint_library.h"
#include <pragmas/AutoPOINT_pragmas.h>
#include <utility/tagitem.h>

char* version={"\0$VER: Bsp.AutoPOINT 1.0 ("__DATE__")  by Uwe Rosenkranz"};


/* SHOWDATE,SHOWTIME,SHOWUSER */
int konfig[3]={0,0,0};


ULONG filelange(char* name)
{
	/* liefert die Länge eines Files */

	ULONG back=0;
	BPTR filelock=Lock(name,ACCESS_READ);
	if(filelock)
	{
		APTR memoryFAST=AllocVec(sizeof(struct FileInfoBlock),MEMF_CLEAR);
		if(memoryFAST)
		{
			if(Examine(filelock,(struct FileInfoBlock*)memoryFAST))
			{
				struct FileInfoBlock * zeiger=(struct FileInfoBlock*)memoryFAST;
				back=zeiger->fib_Size;
			}
			FreeVec(memoryFAST);
		}
		UnLock(filelock);
	}
	return back;
}
void loadkonfig(char* ap_name)
{
  /* Lädt das Konfigfile des AutoPOINT`s `ap_name` und wertet es aus */
	char konfigname[128];
	int konfiglen;
	BPTR konfigfile;

	strcpy(konfigname,"ProgDir:");
	strcat(konfigname,ap_name);
	strcat(konfigname,".conf");

	konfiglen=filelange(konfigname);
	if (konfiglen > 0)
	{
		char* memory=AllocVec(konfiglen+1,MEMF_CLEAR);
		if(memory)
		{
			konfigfile=Open(konfigname,MODE_OLDFILE);
			if(konfigfile)
			{
				int geladen=Read(konfigfile,memory,konfiglen);

				Close(konfigfile);

				if (geladen == konfiglen)
				{
					/* Konfigfile auswerten und Gadgets setzen */

					char *konfigs[]={"<SHOWDATE>","<SHOWTIME>","<SHOWUSER>"};
					char* pointer=memory;
					memory[konfiglen]=0;

					while(pointer < memory+konfiglen)
					{
						if(*pointer)
						{
							int loop=0;
							while(loop < 3)
							{
								if(!strnicmp(konfigs[loop],pointer,strlen(konfigs[loop++])))
									konfig[loop]=TRUE;
							}
						}
						

						/* Anfang der nächsten Zeile suchen */

						pointer++;
						while(*pointer && *pointer!= '\n' && *pointer!= '\r')
							pointer++;
						if(*pointer)
							pointer++;
					}
				}
			}
			FreeVec(memory);
		}
	}
}
void main(int argc,char* argv[])
{
	if (argc == 2)
	{
		struct Library *AutoPOINTBase = OpenLibrary("BBS:Libs/AutoPOINT.library",0);

		if(AutoPOINTBase)
		{
			if (AP_InitInterface(argv[0]))
			{
				APTR handle;

				loadkonfig(argv[1]);

				do
				{
					handle=AP_GetNextMail();
					if(handle)
					{
						int len;
						do
						{
							char buffer[10];
							len = AP_ReadMail(handle,buffer,10);

//Hier Mail lesen und verarbeiten

						}while (len >0);



						{
//Mal ein Reply senden zum Absender

							/* TAG-Daten für eine Mail-Erzeugung */
							struct TagItem tags[]=
							{
								TAG_ZC_ABS,(ULONG)NULL,
								TAG_ZC_BET,(ULONG)"Hallo! Danke fuer den Test ;)",
								TAG_DONE,NULL
							};
							APTR whandle;

              /* Die noch fehlenden Tags fürs Erzeugen der Mail eintragen
                 (eigender Absender (Autopointname)) */

							tags[0].ti_Data=(ULONG)argv[1];


              /* Jetzt die Mail erzeugen und ein Nachricht schreiben und schließen */
							whandle=AP_CreateReplyMail(handle,tags);
							if(whandle)
							{
								char zeile[256];
								strcpy(zeile,"Mann Super! Ich finde das echt gut, daß du mich hier\nangeschrieben hast. Mir ist nämlich so laaangweeeiiilig.\n");
								AP_WriteMail(whandle,zeile,strlen(zeile));

								{
									/* hier nochmal schnell ein Beispiel fuer AP_GetDataTag(); */
									struct TagItem gettags[]=
									{
										TAG_ZC_MID,NULL,
										TAG_DONE,NULL
									};

									strcpy(zeile,"Unter folgender MessegeID schriebst du mir :");
									AP_WriteMail(whandle,zeile,strlen(zeile));

									/* und die MID holen */
									AP_GetDataTag(handle,gettags);
									if(gettags[0].ti_Data)
									{
										AP_WriteMail(whandle,(char*)gettags[0].ti_Data,strlen((char*)gettags[0].ti_Data));
									}
									AP_WriteMail(whandle,"\n",1);
								}

								if(konfig[0] || konfig[1])
								{/* So das Datum bzw Uhrzeit ausgeben */
								  struct DateTime DateTime;
								  char Date[30];
								  char Time[30];

								  DateTime.dat_StrDay  = NULL;
								  DateTime.dat_StrDate = (UBYTE *)Date;
								  DateTime.dat_StrTime = (UBYTE *)Time;
								  DateTime.dat_Format = FORMAT_CDN;
								  DateTime.dat_Flags = NULL;

								  DateStamp(&DateTime.dat_Stamp);

								  if(DateToStr(&DateTime))
									{
										if(konfig[1])
										{
											strcpy(zeile,"\nHier die aktuelle Uhrzeit : ");	
											AP_WriteMail(whandle,zeile,strlen(zeile));
											AP_WriteMail(whandle,Time,strlen(Time));
										}
										if(konfig[0])
										{
											if(konfig[1])
												strcpy(zeile," und das Datum : ");	
											else
												strcpy(zeile,"\nHier das Datum : ");	
											AP_WriteMail(whandle,zeile,strlen(zeile));
											AP_WriteMail(whandle,Date,strlen(Date));
										}
										AP_WriteMail(whandle,"\n",1);
									}
								}
								if(konfig[2])
								{
									/* So, hier müssten jetzt eigentlich mit der AmbosDataLib alle User
                     ausgelesen und ausgegeben werden. Um mir aber Arbeit zu sparen ;),
                     habe ich es mal nicht eingebaut */
									AP_WriteMail(whandle,"\nUser...\n\n",10);
								}
								AP_CloseWriteMail(whandle);
							}
						}

					}
				}while(handle); /* War das die letzte Mail für mich? Sonst zurück und nächste */


        /* Nicht vergessen !!!, sonst hängt der Sorter und der Sysop wird dieses 
           Autopoint-PRG löschen!! */

				AP_CloseInterface();
			}
			else
			{
				printf("Kann mich nicht am Sorter anlinken!\n");
			}
			CloseLibrary(AutoPOINTBase);
		}
		else
		{
			printf("kann AutoPoint-Lib nicht öffnen!\n");
		}
	}
	else
	{
		printf("Na!!! Soll man das Programm von Hand aufrufen? Ich denke nicht....\n");
	}
}