#include <Eina.h>
#include <Eet.h>
#include <Ecore_File.h>
#include "e_macros.h"
#define E_TYPEDEFS
#include "e_config_data.h"
#include "e_intl_data.h"
#undef E_TYPEDEFS
#include "e_config_data.h"
#include "e_intl_data.h"


static void _e_help(void);

/* externally accessible functions */

int
main(int argc, char **argv)
{
   int i = 0;
   int valid_args = 0;
   int write_ops = 0;
   Eet_File *ef = NULL;
   E_Input_Method_Config *write_imc = NULL;
   E_Input_Method_Config *read_imc = NULL;

   char *file = NULL;
   char *set_name = NULL;
   char *set_exe = NULL;
   char *set_setup = NULL;
   char *set_gtk_im_module = NULL;
   char *set_qt_im_module = NULL;
   char *set_xmodifiers = NULL;
   char *set_ecore_imf_module = NULL;
   int list = 0;

   /* handle some command-line parameters */
   for (i = 1; i < argc; i++)
     {
        if ((!strcmp(argv[i], "-set-name")) && (i < (argc - 1)))
          {
             i++;
             set_name = argv[i];
             valid_args++;
             write_ops++;
          }
        else if ((!strcmp(argv[i], "-set-exe")) && (i < (argc - 1)))
          {
             i++;
             set_exe = argv[i];
             valid_args++;
             write_ops++;
          }
        else if ((!strcmp(argv[i], "-set-setup")) && (i < (argc - 1)))
          {
             i++;
             set_setup = argv[i];
             valid_args++;
             write_ops++;
          }
        else if ((!strcmp(argv[i], "-set-gtk-im-module")) && (i < (argc - 1)))
          {
             i++;
             set_gtk_im_module = argv[i];
             valid_args++;
             write_ops++;
          }
        else if ((!strcmp(argv[i], "-set-qt-im-module")) && (i < (argc - 1)))
          {
             i++;
             set_qt_im_module = argv[i];
             valid_args++;
             write_ops++;
          }
        else if ((!strcmp(argv[i], "-set-xmodifiers")) && (i < (argc - 1)))
          {
             i++;
             set_xmodifiers = argv[i];
             valid_args++;
             write_ops++;
          }
        else if ((!strcmp(argv[i], "-set-ecore-imf-module")) && (i < (argc - 1)))
          {
             i++;
             set_ecore_imf_module = argv[i];
             valid_args++;
             write_ops++;
          }
        else if ((!strcmp(argv[i], "-h")) ||
                 (!strcmp(argv[i], "-help")) ||
                 (!strcmp(argv[i], "--h")) ||
                 (!strcmp(argv[i], "--help")))
          {
             _e_help();
             exit(0);
          }
        else if ((!strcmp(argv[i], "-list")))
          {
             list = 1;
             valid_args++;
          }
        else
          file = argv[i];
     }
   if (!file)
     {
        printf("ERROR: no file specified!\n");
        _e_help();
        exit(0);
     }

   if (valid_args == 0)
     {
        printf("ERROR: no valid arguments!\n");
        _e_help();
        exit(0);
     }

   eet_init();
   e_intl_data_init();

   if (write_ops != 0 && ecore_file_exists(file))
     {
        ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
     }
   else if (write_ops != 0)
     {
        ef = eet_open(file, EET_FILE_MODE_WRITE);
     }
   else
     {
        ef = eet_open(file, EET_FILE_MODE_READ);
     }

   if (!ef)
     {
        printf("ERROR: cannot open file %s for READ/WRITE (%i:%s)\n",
               file, errno, strerror(errno));
        return -1;
     }

   /* If File Exists, Try to read imc */
   read_imc = e_intl_input_method_config_read(ef);

   /* else create new imc */
   if (write_ops != 0)
     {
        write_imc = calloc(sizeof(E_Input_Method_Config), 1);
        write_imc->version = E_INTL_INPUT_METHOD_CONFIG_VERSION;
        if (read_imc)
          {
             write_imc->e_im_name = read_imc->e_im_name;
             write_imc->gtk_im_module = read_imc->gtk_im_module;
             write_imc->qt_im_module = read_imc->qt_im_module;
             write_imc->xmodifiers = read_imc->xmodifiers;
             write_imc->ecore_imf_module = read_imc->ecore_imf_module;
             write_imc->e_im_exec = read_imc->e_im_exec;
             write_imc->e_im_setup_exec = read_imc->e_im_setup_exec;
          }

        if (set_name)
          write_imc->e_im_name = set_name;
        if (set_gtk_im_module)
          write_imc->gtk_im_module = set_gtk_im_module;
        if (set_qt_im_module)
          write_imc->qt_im_module = set_qt_im_module;
        if (set_xmodifiers)
          write_imc->xmodifiers = set_xmodifiers;
        if (set_ecore_imf_module)
          write_imc->ecore_imf_module = set_ecore_imf_module;
        if (set_exe)
          write_imc->e_im_exec = set_exe;
        if (set_setup)
          write_imc->e_im_setup_exec = set_setup;

        /* write imc to file */
        e_intl_input_method_config_write(ef, write_imc);
     }

   if (list)
     {
        printf("Config File List:\n");
        printf("Config Version:    %i\n", read_imc->version);
        printf("Config Name:       %s\n", read_imc->e_im_name);
        printf("Command Line:      %s\n", read_imc->e_im_exec);
        printf("Setup Line:        %s\n", read_imc->e_im_setup_exec);
        printf("gtk_im_module:     %s\n", read_imc->gtk_im_module);
        printf("qt_im_module:      %s\n", read_imc->qt_im_module);
        printf("xmodifiers:        %s\n", read_imc->xmodifiers);
        printf("ecore_imf_module:  %s\n", read_imc->ecore_imf_module);
     }

   e_intl_input_method_config_free(read_imc);
   free(write_imc);
   eet_close(ef);
   e_intl_data_shutdown();
   eet_shutdown();
   /* just return 0 to keep the compiler quiet */
   return 0;
}

static void
_e_help(void)
{
   printf("OPTIONS:\n"
          "  -set-name NAME             Set the application name\n"
          "  -set-exe EXE               Set the application execute line\n"
          "  -set-setup EXE             Set the setup application execute line\n"
          "  -set-gtk-im-module         Set the gtk_im_module env var\n"
          "  -set-qt-im-module          Set the qt_im_module env var\n"
          "  -set-ecore-imf-module      Set the ecore_imf_module env var\n"
          "  -set-xmodifiers            Set the xmodifiers env var\n"
          "  -list                      List Contents of Input Method Config file\n"
          );
}

