#include <clib/dos_protos.h>
#include <clib/locale_protos.h>
#include <clib/icon_protos.h>
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <string.h>
#include <workbench/workbench.h>
#include <workbench/startup.h>
#include <workbench/icon.h>
#include "GUIFuncs.h"
struct Library *IconBase = NULL;
struct Library *ListBrowserBase = NULL;
struct Library *WindowBase = NULL;
struct Library *LabelBase = NULL;
struct Library *LayoutBase = NULL;
struct Library *CheckBoxBase = NULL;
struct Library *ChooserBase = NULL;
struct Library *IntegerBase = NULL;
struct Library *IFFParseBase = NULL;
struct Library *WorkbenchBase = NULL;
struct Library *AslBase = NULL;
struct Library *LocaleBase = NULL;
struct Catalog *CatalogFile = NULL;
STRPTR envstring = "ENV:sys/workbench.prefs";
STRPTR envarcstring = "ENVARC:sys/workbench.prefs";
STRPTR requiredstring = "Requires %s V%ld"; 
extern struct EasyStruct liberror;
extern struct List label_list;

int OpenLibraries()
{
    if (!(LocaleBase = OpenLibrary ("locale.library", 44)))
    {
        struct EasyStruct temperror =
        {
            sizeof(struct EasyStruct),
            0,
            "Program Error",
            requiredstring,
            "OK"
        };
        EasyRequest(NULL,&temperror,NULL,"locale.library",44);
        return(0);
    }
    else
    {
        CatalogFile = OpenCatalog(NULL,"sys/gbprefs.catalog",OC_BuiltInLanguage,"english",TAG_DONE); 
        InitStrings(CatalogFile);
    }
    if (!(WorkbenchBase = OpenLibrary("workbench.library", 44)))
    {
        EasyRequest(NULL,&liberror,NULL,"workbench.library",44);
        return(0);
    }
    if (!(IconBase = OpenLibrary("icon.library", 44)))
    {
        EasyRequest(NULL,&liberror,NULL,"icon.library",44);
        return(0);
    }
    if (!(AslBase = OpenLibrary("asl.library",44)))
    {
        EasyRequest(NULL,&liberror,NULL,"workbench.library",44); 
        return(0);
    }
    if (!(ListBrowserBase = OpenLibrary("gadgets/listbrowser.gadget", 44)))
    {
        EasyRequest(NULL,&liberror,NULL,"listbrowser.gadget",44);
        return(0);
    }
    if (!(WindowBase = OpenLibrary("window.class", 44)))
    {
        EasyRequest(NULL,&liberror,NULL,"window.class",44);
        return(0);
    }
    if (!(LayoutBase = OpenLibrary("gadgets/layout.gadget", 44)))
    {
        EasyRequest(NULL,&liberror,NULL,"layout.gadget",44);
        return(0);
    }
    if (!(CheckBoxBase = OpenLibrary("gadgets/checkbox.gadget", 44)))
    {
        EasyRequest(NULL,&liberror,NULL,"checkbox.gadget",44);
        return(0);
    }
    if (!(ChooserBase = OpenLibrary("gadgets/chooser.gadget", 44)))
    {
        EasyRequest(NULL,&liberror,NULL,"chooser.gadget",44);
        return(0);
    }
    if (!(IntegerBase = OpenLibrary("gadgets/integer.gadget", 44)))
    {
        EasyRequest(NULL,&liberror,NULL,"integer.gadget",44);
        return(0);
    }
    if (!(LabelBase = OpenLibrary("images/label.image", 44)))
    {
        EasyRequest(NULL,&liberror,NULL,"label.image",44);
        return(0);
    }
    if (!(IFFParseBase = OpenLibrary ("iffparse.library", 0)))
    {
        EasyRequest(NULL,&liberror,NULL,"iffparse.library",44);
        return(0);
    }
    return(1);
}

void CloseLibraries()
{
    if(CatalogFile) CloseCatalog(CatalogFile);
    if(IconBase) CloseLibrary(IconBase);
    if(IntegerBase) CloseLibrary(IntegerBase);
    if(ChooserBase) CloseLibrary(ChooserBase);
    if(CheckBoxBase) CloseLibrary(CheckBoxBase);
    if(WindowBase) CloseLibrary(WindowBase);
    if(LayoutBase) CloseLibrary(LayoutBase);
    if(ListBrowserBase) CloseLibrary(ListBrowserBase);
    if(LabelBase) CloseLibrary(LabelBase);
    if(IFFParseBase) CloseLibrary(IFFParseBase);
    if(WorkbenchBase) CloseLibrary(WorkbenchBase);
    if(AslBase) CloseLibrary(AslBase);
    if(LocaleBase) CloseLibrary(LocaleBase);
}



/* This is the start of our programme.
 */
void realmain(char *filename,char *screenname,short flag)
{
    UWORD Icon_Flag = 0;
    struct Screen *PrefScreen;
    NewList(&label_list);
    InitStrings(CatalogFile);  
    if(filename)
        LoadSettings(filename);
    else
        LoadSettings(envstring);
    if(flag >= 4)
    {
        Icon_Flag = 1;
        flag -= 4;
    }
    switch(flag)
    {
        case 0: /* edit preferences */
            if(PrefScreen = (struct Screen *)LockPubScreen(screenname))
                EditPreferences(screenname,PrefScreen,Icon_Flag);
            else
            {
                screenname = NULL;
                if(PrefScreen = (struct Screen *)LockPubScreen(screenname))
                    EditPreferences(screenname,PrefScreen,Icon_Flag);
            }
            break;
        case 1: /* use preferences */
            SavePrefs(envstring,TRUE);
            break;
        case 2: /* save preferences */
            SavePrefs(envstring,TRUE);
            SavePrefs(envarcstring,FALSE);
            break;
        default:
            break;
    }
    Free_List(&label_list);
}
void main(long argc, *argv[])
{
    if(OpenLibraries())
    {
        char *pubscreen=NULL;
        short option=0;
        char templatestr[] = "FILE,EDIT/S,USE/S,SAVE/S,PUBSCREEN/K";
        long outarray[6] = {0,0,0,0,0,0};
        char *filename = NULL;
        struct RDArgs *InputArgs;
        if(InputArgs=ReadArgs(templatestr,outarray,NULL))
        {
            filename = (char *)outarray[0];
            pubscreen=(char *)outarray[4];
            if(outarray[2])
                option=1;
            if(outarray[3])
                option=2;
            if(outarray[1])
                option=0;
            realmain(filename,pubscreen,option);
            FreeArgs(InputArgs);
        }
        else
            realmain(NULL,NULL,0);
    }
    CloseLibraries();
}

void wbmain(struct WBStartup *wbmsg)
{
    char *pubscreen=NULL;
    char **tt = NULL;
    short option=0;
    if(OpenLibraries())
    {
        if(wbmsg->sm_NumArgs == 1)
        {
            tt=ArgArrayInit(0,wbmsg);
            pubscreen=FindToolType(tt,"PUBSCREEN");
            if(FindToolType(tt,"USE"))
                option=1;
            if(FindToolType(tt,"SAVE"))
                option=2;
            if(FindToolType(tt,"EDIT"))
                option=0;
            if(MatchToolValue(FindToolType(tt,"CREATEICONS"),"YES"))
                option+=4;
            realmain(NULL,pubscreen,option);
            ArgArrayDone();
        }
        char buffer[150];
        if(wbmsg->sm_NumArgs >= 2)
        {
            struct DiskObject *diskobj;
            NameFromLock(wbmsg->sm_ArgList[1].wa_Lock,buffer,150);
            AddPart(buffer,wbmsg->sm_ArgList[1].wa_Name,150);
            if(diskobj=GetDiskObjectNew(buffer))
            {
                pubscreen=FindToolType(diskobj->do_ToolTypes,"PUBSCREEN");
                if(FindToolType(diskobj->do_ToolTypes,"USE"))
                    option=1;
                if(FindToolType(diskobj->do_ToolTypes,"SAVE"))
                    option=2;
                if(FindToolType(diskobj->do_ToolTypes,"EDIT"))
                    option=0;
                if(MatchToolValue(FindToolType(diskobj->do_ToolTypes,"CREATEICONS"),"YES"))
                    option += 4;
            }
            realmain(buffer,pubscreen,option);
            if(diskobj) FreeDiskObject(diskobj);
        }
    }
    CloseLibraries();
}

