#ifndef LIBRARIES_LOCALE_H
#include <libraries/locale.h>
#endif

#include <proto/amigaguide.h>

#include "xmris.h"
#include "Manual.h"
#include "Errors.h"
#include "Catalog.h"

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

struct Manual
{
  struct NewAmigaGuide NewAmigaGuide;
  AMIGAGUIDECONTEXT AmigaGuideContext;
};

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

struct Library *AmigaGuideBase;

static struct Manual *Manual;

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

void CloseManual(void)

{
  if (Manual!=NULL)
    {
      if (Manual->NewAmigaGuide.nag_Lock!=MKBADDR(NULL))
	{
	  if (Manual->AmigaGuideContext!=NULL)
	    {
	      CloseAmigaGuide(Manual->AmigaGuideContext);
	    }
	  CloseLibrary(AmigaGuideBase);
	  UnLock(Manual->NewAmigaGuide.nag_Lock);
	}
      GS_MemoryFree(Manual);
      Manual=NULL;
    }
}

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

void OpenManual(void)

{
  if (Manual==NULL)
    {
      if ((Manual=GS_MemoryAlloc(sizeof(*Manual)))!=NULL)
	{
	  static char *Languages[]={"deutsch","english",NULL};

	  char **Language;
	  BPTR DirLock;
	  int Error;

	  memset(&Manual->NewAmigaGuide,0,sizeof(Manual->NewAmigaGuide));
	  Error=FALSE;
	  DirLock=MKBADDR(NULL);
	  for (Language=(Locale!=NULL ? Locale->loc_PrefLanguages : Languages);
	       !Error && DirLock==MKBADDR(NULL) && *Language!=NULL;
	       Language++)
	    {
	      char *Filename;

	      if ((Filename=GS_FormatString("PROGDIR:Manuals/%s/mris.guide",Language,NULL,NULL))!=NULL)
		{
		  BPTR FileLock;

		  if ((FileLock=Lock(Filename,SHARED_LOCK))!=MKBADDR(NULL))
		    {
		      DirLock=ParentDir(FileLock);
		      UnLock(FileLock);
		    }
		  else
		    {
		      LONG Err;

		      Err=IoErr();
		      if (Err!=ERROR_OBJECT_NOT_FOUND && Err!=ERROR_DIR_NOT_FOUND)
			{
			  Error=TRUE;
			}
		    }
		  GS_MemoryFree(Filename);
		}
	      else
		{
		  Error=TRUE;
		}
	    }
	  if (DirLock!=MKBADDR(NULL))
	    {
	      Manual->NewAmigaGuide.nag_Lock=DirLock;
	      if ((AmigaGuideBase=OpenLibrary("amigaguide.library",34))!=NULL)
		{
		  Manual->NewAmigaGuide.nag_Name="mris.guide";
		  Manual->NewAmigaGuide.nag_Screen=display.Screen->Screen;
		  Manual->NewAmigaGuide.nag_BaseName="MRIS";
		  if ((Manual->AmigaGuideContext=OpenAmigaGuideAsyncA(&Manual->NewAmigaGuide,NULL))!=NULL)
		    {
		      return;
		    }
		}
	      else
		{
		  DisplayError(MSG_NO_LIBRARY,"amigaguide.library");
		}
	    }
	  else
	    {
	      DisplayError(MSG_NO_MANUAL);
	    }
	  CloseManual();
	}
    }
  else
    {
      SendAmigaGuideCmdA(Manual->AmigaGuideContext,"LINK Main",NULL);
    }
}

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

int ProcessManual(void)

{
  if (Manual!=NULL)
    {
      struct AmigaGuideMsg *AmigaGuideMsg;

      if ((AmigaGuideMsg=GetAmigaGuideMsg(Manual->AmigaGuideContext))!=NULL)
	{
	  int Quit;

	  Quit=FALSE;
	  switch (AmigaGuideMsg->agm_Type)
	    {
	    case ActiveToolID:
	      if (!SendAmigaGuideCmdA(Manual->AmigaGuideContext,"LINK Main",NULL))
		{
		  Quit=TRUE;
		}
	      break;

	    case ToolCmdReplyID:
	      if (AmigaGuideMsg->agm_Pri_Ret)
		{
		  Quit=TRUE;
		}
	      break;

	    case ShutdownMsgID:
	    case ShutdownToolID:
	      Quit=TRUE;
	      break;
	    }
	  ReplyAmigaGuideMsg(AmigaGuideMsg);
	  if (Quit)
	    {
	      CloseManual();
	    }
	  return TRUE;
	}
    }
  return FALSE;
}
