/* main.c - Tag-o-Miga prefs tool */

/// Includes
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <proto/muimaster.h>
#include <libraries/mui.h>
#include "config.h"
#include "protos.h"
#include "a_prefsgui.h"
#include "tagfile.h"
///
/// Defines
#define ID_NAME "Tag-o-Miga-Prefs"
#define ID_LONGNAME "Tag-o-Miga Preferences Editor"
#define ID_REL "1.1b"
#define ID_DATE __DATE__
#define IDSTRING ID_NAME " " ID_REL
///
/// Prototypes
Local int main (int argc, char **argv);
Local void wbmain (void *msg);
Local void cleanup (void);

Local void ConfigToGUI (void);
Local void GUIToConfig (void);
///
/// Global variables
struct MUIBase *MUIBase = NULL;
char *VerString = "$VER: " ID_NAME " " ID_REL " " ID_DATE;
extern struct Window *ReqWindow = NULL;
struct ObjApp *objApp = NULL;
//ULONG argarray[1];
///

/// main
/* ----------------------------------- main ------------------------------------

 Comment: Startup (command line)

*/

int main (int argc, char **argv)
{
    BOOL running = TRUE;

    atexit (cleanup);

    MUIBase = OpenLibrary ("muimaster.library", 0L);
    if (!MUIBase) {
        AlertUser ("You need MUI to use this program", "_OK");
        return 20;
    }

    objApp = CreateApp ();
    if (!objApp) {
        AlertUser ("Couldn't open window", "_OK");
        return 20;
    }

    load_config (CFG_USE);
    ConfigToGUI ();
    set (objApp->WI_MainWindow, MUIA_Window_Open, TRUE);

    while (running)
    {
        ULONG signal = 0, rid;

        switch (rid = DoMethod(objApp->App, MUIM_Application_Input, &signal))
        {
            case MUIV_Application_ReturnID_Quit:
            case ID_CANCEL:
                running = FALSE;
                break;

            case ID_USE:
                GUIToConfig ();
                save_config (CFG_USE);
                running = FALSE;
                break;

            case ID_SAVE:
                GUIToConfig ();
                save_config (CFG_SAVE);
                running = FALSE;
                break;
        }
    }

    return 0;
}
///
/// wbmain
/* ---------------------------------- wbmain -----------------------------------

 Comment: Startup (Workbench)

*/

void wbmain (void *msg)
{
    main (0, NULL);
}
///
/// cleanup
/* ---------------------------------- cleanup ----------------------------------

 Comment: clean up resources

*/

void cleanup (void)
{
    if (objApp) {
        DisposeApp (objApp);
        objApp = NULL;
    }

    if (MUIBase) {
        CloseLibrary (MUIBase);
        MUIBase = NULL;
    }

}
///

/// ConfigToGUI
/* -------------------------------- ConfigToGUI --------------------------------

 Comment: Update GUI with configuration

*/

void ConfigToGUI (void)
{
    int type;

    /* Files */
    set (objApp->STR_PA_MoodFile,   MUIA_String_Contents, Config.Part[0].File);
    set (objApp->STR_PA_HeaderFile, MUIA_String_Contents, Config.Part[1].File);
    set (objApp->STR_PA_NPFile,     MUIA_String_Contents, Config.Part[2].File);
    set (objApp->STR_PA_SigFile,    MUIA_String_Contents, Config.Part[3].File);
    set (objApp->STR_PA_TagFile,    MUIA_String_Contents, Config.Part[4].File);

    set (objApp->CH_Mood,    MUIA_Selected, Config.Part[0].Mode);
    set (objApp->CH_Header,  MUIA_Selected, Config.Part[1].Mode);
    set (objApp->CH_NP,      MUIA_Selected, Config.Part[2].Mode);
    set (objApp->CH_Sig,     MUIA_Selected, Config.Part[3].Mode);
    set (objApp->CH_Tagline, MUIA_Selected, Config.Part[4].Mode);

    /* Macros */
    set (objApp->STR_FullName,  MUIA_String_Contents, Config.Macro[0]);
    set (objApp->STR_FirstName, MUIA_String_Contents, Config.Macro[1]);
    set (objApp->STR_LastName,  MUIA_String_Contents, Config.Macro[2]);
    set (objApp->STR_Date,      MUIA_String_Contents, Config.Macro[3]);
    set (objApp->STR_Time,      MUIA_String_Contents, Config.Macro[4]);
    set (objApp->STR_Subject,   MUIA_String_Contents, Config.Macro[5]);

    /* Miscellaneous */
    set (objApp->STR_PA_EditorCmd, MUIA_String_Contents, Config.EditCmd);
    set (objApp->STR_LogFile,      MUIA_String_Contents, Config.LogFile);

    set (objApp->CH_GUI,         MUIA_Selected, Config.GUI);
    set (objApp->CH_InfoLine,    MUIA_Selected, !Config.NoInfo);
    set (objApp->CH_Tagfilename, MUIA_Selected, !Config.NoTagName);

    switch (Config.DefTagfileType) {
        case TAGFILE_ONELINER: type = 0; break;
        case TAGFILE_FORTUNE: type = 1; break;
        case TAGFILE_SPOT: type = 2; break;
        case TAGFILE_CYCLONE: type = 3; break;
        default: type = 0; break;
    }
    set (objApp->CY_DefFileType, MUIA_Cycle_Active, type);
    set (objApp->CH_UseIndex, MUIA_Selected, Config.MakeIndex);
    set (objApp->CH_Buffer, MUIA_Selected, Config.Buffer);
}
///
/// GUIToConfig
/* -------------------------------- GUIToConfig --------------------------------

 Comment: Update configuration from GUI

*/

void GUIToConfig (void)
{
    char *str;
    ULONG b;
    int type;

    /* Files */
    get (objApp->STR_PA_MoodFile,   MUIA_String_Contents, &str); strcpy (Config.Part[0].File, str);
    get (objApp->STR_PA_HeaderFile, MUIA_String_Contents, &str); strcpy (Config.Part[1].File, str);
    get (objApp->STR_PA_NPFile,     MUIA_String_Contents, &str); strcpy (Config.Part[2].File, str);
    get (objApp->STR_PA_SigFile,    MUIA_String_Contents, &str); strcpy (Config.Part[3].File, str);
    get (objApp->STR_PA_TagFile,    MUIA_String_Contents, &str); strcpy (Config.Part[4].File, str);

    get (objApp->CH_Mood,    MUIA_Selected, &b); Config.Part[0].Mode = b;
    get (objApp->CH_Header,  MUIA_Selected, &b); Config.Part[1].Mode = b;
    get (objApp->CH_NP,      MUIA_Selected, &b); Config.Part[2].Mode = b;
    get (objApp->CH_Sig,     MUIA_Selected, &b); Config.Part[3].Mode = b;
    get (objApp->CH_Tagline, MUIA_Selected, &b); Config.Part[4].Mode = b;

    /* Macros */
    get (objApp->STR_FullName,  MUIA_String_Contents, &str); strcpy (Config.Macro[0], str);
    get (objApp->STR_FirstName, MUIA_String_Contents, &str); strcpy (Config.Macro[1], str);
    get (objApp->STR_LastName,  MUIA_String_Contents, &str); strcpy (Config.Macro[2], str);
    get (objApp->STR_Date,      MUIA_String_Contents, &str); strcpy (Config.Macro[3], str);
    get (objApp->STR_Time,      MUIA_String_Contents, &str); strcpy (Config.Macro[4], str);
    get (objApp->STR_Subject,   MUIA_String_Contents, &str); strcpy (Config.Macro[5], str);

    /* Miscellaneous */
    get (objApp->STR_PA_EditorCmd, MUIA_String_Contents, &str); strcpy (Config.EditCmd, str);
    get (objApp->STR_LogFile,      MUIA_String_Contents, &str); strcpy (Config.LogFile, str);

    get (objApp->CH_GUI,         MUIA_Selected, &b); Config.GUI = b;
    get (objApp->CH_InfoLine,    MUIA_Selected, &b); Config.NoInfo = !b;
    get (objApp->CH_Tagfilename, MUIA_Selected, &b); Config.NoTagName = !b;

    get (objApp->CY_DefFileType, MUIA_Cycle_Active, &type);
    switch (type) {
        case 0: Config.DefTagfileType = TAGFILE_ONELINER; break;
        case 1: Config.DefTagfileType = TAGFILE_FORTUNE; break;
        case 2: Config.DefTagfileType = TAGFILE_SPOT; break;
        case 3: Config.DefTagfileType = TAGFILE_CYCLONE; break;
        default: type = 0; break;
    }
    get (objApp->CH_UseIndex, MUIA_Selected, &b); Config.MakeIndex = b;
    get (objApp->CH_Buffer, MUIA_Selected, &b); Config.Buffer = b;
}
///
