/*
 * actions.c
 */

#include <stdlib.h>
#include "defines.h"
#include "variables.h"
#include "dialogs.h"
#include "mainwindow.h"
#include "tools.h"
#include "popedit.h"
#include "actions.h"


void quit_app()
{
        FREE(command);
        FREE(notif_cmd);
        FREE(config_file);
        FREE(light_color);
        free_mbox(&mboxes);
        gtk_main_quit();
}


void set_list()
{
        MailBox *box = mboxes;
        gchar *text_line[COLS];
        int row = 0, r = 0;

        gtk_clist_clear(GTK_CLIST(filelist));
        selected_row = -1;
        gtk_clist_freeze(GTK_CLIST(filelist));
        while (box)
        {
                text_line[0] = (r == boxnum) ? "X" : "";
                text_line[1] = box->type ? box->type : "ERROR";
                text_line[2] = box->entry ? box->entry : "ERROR";
                text_line[3] = box->username ? box->username : "";
                text_line[4] = box->password ? box->password : "";
                text_line[5] = box->folder ? box->folder : "";
                row = gtk_clist_append(GTK_CLIST(filelist), text_line);
                gtk_clist_set_row_data(GTK_CLIST(filelist), row, (gpointer)box);
                box = box->next;
                r++;
        }
        gtk_clist_thaw(GTK_CLIST(filelist));
        list_unsel_cb(GTK_CLIST(filelist), 0, 0, NULL, NULL);
}

void set_values()
{
        char text[MAXSTRLEN];

        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wid_backlight), backlight);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wid_blink),
                                     switch_authorized);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wid_runonce), run_once);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wid_testsize), test_size);
        if (light_color) gtk_entry_set_text(GTK_ENTRY(wid_color), light_color);
        if (command) gtk_entry_set_text(GTK_ENTRY(wid_command), command);
        if (notif_cmd) gtk_entry_set_text(GTK_ENTRY(wid_notify), notif_cmd);
        memset(text, 0, MAXSTRLEN);
        snprintf(text, MAXSTRLEN - 1, "%d", update_interval);
        gtk_entry_set_text(GTK_ENTRY(wid_interval), text);
        memset(text, 0, MAXSTRLEN);
        snprintf(text, MAXSTRLEN - 1, "%d", check_delay);
        gtk_entry_set_text(GTK_ENTRY(wid_checkdelay), text);

        set_list();
}


void save_datas()
{
        char *value = gtk_entry_get_text(GTK_ENTRY(wid_interval));

        update_interval = atoi(value);
        value = gtk_entry_get_text(GTK_ENTRY(wid_checkdelay));
        check_delay = atoi(value);
        light_color = gtk_entry_get_text(GTK_ENTRY(wid_color));
        command = gtk_entry_get_text(GTK_ENTRY(wid_command));
        notif_cmd = gtk_entry_get_text(GTK_ENTRY(wid_notify));
        backlight = GTK_TOGGLE_BUTTON(wid_backlight)->active;
        switch_authorized = GTK_TOGGLE_BUTTON(wid_blink)->active;
        run_once = GTK_TOGGLE_BUTTON(wid_runonce)->active;
        test_size = GTK_TOGGLE_BUTTON(wid_testsize)->active;

        save_cfgfile();
}


/* finition de la création des nouvelles boites */

void do_add_box(const char *btype, const char *box)
{
        char *boxline = xmalloc(strlen(btype) + strlen(box) + 3);

        sprintf(boxline, "%s %s", btype, box);
        mbox_add(&mboxes, boxline);
        set_list();
        FREE(boxline);
}

void do_addmbox(GtkWidget *widget, void *fs)
{
        char *filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs));
        do_add_box("MBOX", filename);
}


void do_addmaildir(GtkWidget *widget, void *fs)
{
        char *filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs));
        do_add_box("MAILDIR", filename);
}


void do_addpop3(GtkWidget *widget, void *txt)
{
        char *datas = gtk_entry_get_text(GTK_ENTRY(txt));
        do_add_box("POP3", datas);
}


void do_addhotmail(GtkWidget *widget, void *txt)
{
        char *datas = gtk_entry_get_text(GTK_ENTRY(txt));
        do_add_box("HOTMAIL", datas);
}


void do_addmh(GtkWidget *widget, void *fs)
{
        char *filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs));
        do_add_box("MH", filename);
}


void do_addimap(GtkWidget *widget, void *txt)
{
        char *datas = gtk_entry_get_text(GTK_ENTRY(txt));
        do_add_box("IMAP", datas);
}


/* dialogues de création de boites */

void add_mbox()
{
        file_dialog("Add local mail box...", NULL, NULL, do_addmbox, NULL);
}


void add_maildir()
{
        file_dialog("Add Maildir mail box...", NULL, NULL, do_addmaildir, NULL);
}


void add_pop3()
{
        pop_edit("Add POP3 mail box...", NULL, NULL, NULL, NULL, do_addpop3);
}


void add_hotmail()
{
        pop_edit("Add Hotmail mail box...", NULL, NULL, NULL, NULL, do_addhotmail);
}


void add_mh()
{
        file_dialog("Add MH mail box...", NULL, NULL, do_addmh, NULL);
}


void add_imap()
{
        pop_edit("Add IMAP mail box...", NULL, NULL, NULL, NULL, do_addimap);
}


/* fonctions de modifications d'entrées */

void update_current_box(const char *e, const char *u, const char *p, const char *f)
{
        MailBox *box;

        box = (MailBox *)gtk_clist_get_row_data(GTK_CLIST(filelist), selected_row);
        FREE(box->entry);
        FREE(box->username);
        FREE(box->password);
        FREE(box->folder);
        box->entry = e ? xstrdup(e) : xstrdup("ERROR");
        box->username = u ? xstrdup(u) : NULL;
        box->password = p ? xstrdup(p) : NULL;
        box->folder = f ? xstrdup(f) : NULL;
        set_list();
}


void do_change_file(GtkWidget *widget, void *fs)
{
        char *filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs));
        update_current_box(filename, NULL, NULL, NULL);
}


void do_change_dist(GtkWidget *widget, void *txt)
{
        char *datas = gtk_entry_get_text(GTK_ENTRY(txt));
        char e[MAXSTRLEN + 1], u[MAXSTRLEN + 1];
        char p[MAXSTRLEN + 1], f[MAXSTRLEN + 1];

        sscanf(datas, "%s %s %s %s", e, u, p, f);
        update_current_box(e, u, p, f);
}


void edit_entry()
{
        MailBox *box;
        /*
                ok_dialog("Not yet implemented.",
                          "Sorry, this function is not yet implemented !");
        */
        box = (MailBox *)gtk_clist_get_row_data(GTK_CLIST(filelist), selected_row);
        if (strcmp(box->type, "MBOX") == 0)
                file_dialog("Edit local mail box...",
                            box->entry, NULL, do_change_file, NULL);
        if (strcmp(box->type, "MAILDIR") == 0)
                file_dialog("Edit Maildir mail box...",
                            box->entry, NULL, do_change_file, NULL);
        if (strcmp(box->type, "MH") == 0)
                file_dialog("Edit MH mail box...",
                            box->entry, NULL, do_change_file, NULL);
        if (strcmp(box->type, "IMAP") == 0)
                pop_edit("Edit IMAP mail box...",
                         box->entry, box->username, box->password, box->folder,
                         do_change_dist);
        if (strcmp(box->type, "POP3") == 0)
                pop_edit("Edit POP3 mail box...",
                         box->entry, box->username, box->password, box->folder,
                         do_change_dist);
        if (strcmp(box->type, "HOTMAIL") == 0)
                pop_edit("Edit Hotmail mail box...",
                         box->entry, box->username, box->password, box->folder,
                         do_change_dist);
}


void set_default()
{
        MailBox *def, *box;
        int num = 0, row;

        /* get previous default box */
        def = mboxes;
        while (num != boxnum)
        {
                def = def->next;
                num++;
        }
        /* get actual row for previous default box */
        row = gtk_clist_find_row_from_data(GTK_CLIST(filelist), (gpointer)def);
        /* get selected default box */
        box = (MailBox *)gtk_clist_get_row_data(GTK_CLIST(filelist), selected_row);
        /* set text in both rows */
        gtk_clist_set_text(GTK_CLIST(filelist), row, 0, "");
        gtk_clist_set_text(GTK_CLIST(filelist), selected_row, 0, "X");
        /* get new default box number */
        num = 0;
        def = mboxes;
        while (def && (def != box))
        {
                def = def->next;
                num++;
        }
        if (def && (def == box)) boxnum = num;
}


void remove_box()
{
        MailBox *def, *box, *prev;
        int num = 0;

        def = mboxes;
        while (num != boxnum)
        {
                def = def->next;
                num++;
        }

        box = (MailBox *)gtk_clist_get_row_data(GTK_CLIST(filelist), selected_row);
        if (def == box) boxnum = 0;
        prev = mboxes;
        while (prev && (prev->next != box))
        {
                prev = prev->next;
        }
        if (box == mboxes)
        {
                mboxes = box->next;
        }
        else if (prev != NULL)
        {
                prev->next = box->next;
        }
        else
        {
                fprintf(stderr, "Error when removing mail box...\n");
        }
        FREE(box->entry);
        FREE(box->username);
        FREE(box->password);
        FREE(box->folder);
        FREE(box);
        set_list();
}

