/* ====================================================================
 * FTD4Linux Software License, Version 1.0
 *
 * Copyright (c) 2000-2004 The FTD4Linux Development Team.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        FTD4Linux Development Team (http://www.ftd4linux.2y.net/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "FTD" and "FTD4Linux" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact alguno@ftd4linux.2y.net.
 *
 * 5. Products derived from this software may not be called "FTD4Linux",
 *    nor may "FTD4Linux" appear in their name, without prior written
 *    permission of the FTD4Linux Development Team.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE FTD4LINUX DEVELOPMENT TEAM OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>

#include "ftd4linux.h"
#include "ftd_gui_errhandler.h"

#define ONDERDEELSTR_UPDATEN            "Het updaten van de lijst met postings is mislukt."
#define ONDERDEELSTR_EVENTINFO          "Het ophalen van de FTD Posting info is mislukt"
#define ONDERDEELSTR_EVENTINFO_FORUM    "Het ophalen van de forumberichten behorende\nbij de FTD Posting info is mislukt"
#define ONDERDEELSTR_CHECKMAIL          "Het controleren op nieuwe FTD Mail is mislukt"
#define ONDERDEELSTR_FETCHMAIL          "Het ophalen van FTD Mail is mislukt"
#define ONDERDEELSTR_POSTMAIL           "Het versturen van het FTD Mail bericht is mislukt"
#define ONDERDEELSTR_GROUPS             "Het ophalen van de lijst met nieuwsgroepen is mislukt"
#define ONDERDEELSTR_KUDOS_GIVE         "Het ophalen van het kudos saldo is mislukt"
#define ONDERDEELSTR_KUDOS_GET          "Het geven van kudos is mislukt"
#define ONDERDEELSTR_SIGNUP             "Het aanmaken van een nieuw FTD account is mislukt"
#define ONDERDEELSTR_POST               "Het toevoegen van de FTD posting is mislukt"
#define ONDERDEELSTR_MYFTD              "Het ophalen van MyFTD gegevens is mislukt"
#define ONDERDEELSTR_DOWNLOAD_WATCHLIST "Het downloaden van de watchlist is mislukt"
#define ONDERDEELSTR_UPLOAD_WATCHLIST   "Het uploaden van de watchlist is mislukt"
#define ONDERDEELSTR_MODJE              "Het inschakelen van een modje is mislukt"
#define ONDERDEELSTR_PROFILE            "Het ophalen van de profielinformatie is mislukt"

void
ftd_gui_dialog_show(char *onderdeelString, char *melding, GtkWidget *parent, gboolean is_error)
{
    GtkWidget *dialog;
    char *totaalbericht;

    if (onderdeelString) {
        totaalbericht = (char *) g_malloc ((gulong) (strlen(onderdeelString) + strlen(melding) + 2));
        snprintf(totaalbericht, strlen(onderdeelString) + strlen(melding) + 2, "%s\n%s", onderdeelString, melding);
    } else {
        totaalbericht = (char *) g_malloc ((gulong) strlen(melding) + 1);
        snprintf(totaalbericht, strlen(melding) + 1, "%s", melding);
    }

    dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
                                         GTK_DIALOG_DESTROY_WITH_PARENT,
                                         (is_error) ? GTK_MESSAGE_ERROR : GTK_MESSAGE_INFO,
                                         GTK_BUTTONS_CLOSE,
                                         totaalbericht);

    gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
    gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW(parent));
    gtk_dialog_run (GTK_DIALOG (dialog));
    gtk_widget_destroy(dialog);

    g_free (totaalbericht);
}

void
ftd_gui_errhandler(GtkWidget *parent, FtdOnderdeel onderdeel, FtdErrorCode errcode, const char *errmsg)
{
    char *onderdeelString = NULL;

    if (errcode == ERROR_NONE) {
        return;
    }

/*
    if (status) {
        parent = status;
    }
*/

    switch (onderdeel) {
        case FTD_ONDERDEEL_UPDATEN:
            onderdeelString = ONDERDEELSTR_UPDATEN;
            break;
        case FTD_ONDERDEEL_EVENTINFO:
            onderdeelString = ONDERDEELSTR_EVENTINFO;
            break;
        case FTD_ONDERDEEL_EVENTINFO_FORUM:
            onderdeelString = ONDERDEELSTR_EVENTINFO_FORUM;
            break;
        case FTD_ONDERDEEL_CHECKMAIL:
            onderdeelString = ONDERDEELSTR_CHECKMAIL;
            break;
        case FTD_ONDERDEEL_FETCHMAIL:
            onderdeelString = ONDERDEELSTR_FETCHMAIL;
            break;
        case FTD_ONDERDEEL_POSTMAIL:
            onderdeelString = ONDERDEELSTR_POSTMAIL;
            break;
        case FTD_ONDERDEEL_GROUPS:
            onderdeelString = ONDERDEELSTR_GROUPS;
            break;
        case FTD_ONDERDEEL_KUDOS_GET:
            onderdeelString = ONDERDEELSTR_KUDOS_GET;
            break;
        case FTD_ONDERDEEL_KUDOS_GIVE:
            onderdeelString = ONDERDEELSTR_KUDOS_GIVE;
            break;
        case FTD_ONDERDEEL_SIGNUP:
            onderdeelString = ONDERDEELSTR_SIGNUP;
            break;
        case FTD_ONDERDEEL_POST:
            onderdeelString = ONDERDEELSTR_POST;
            break;
        case FTD_ONDERDEEL_MYFTD:
            onderdeelString = ONDERDEELSTR_MYFTD;
            break;
        case FTD_ONDERDEEL_DOWNLOAD_WATCHLIST:
            onderdeelString = ONDERDEELSTR_DOWNLOAD_WATCHLIST;
            break;
        case FTD_ONDERDEEL_UPLOAD_WATCHLIST:
            onderdeelString = ONDERDEELSTR_UPLOAD_WATCHLIST;
            break;
        case FTD_ONDERDEEL_MODJE:
            onderdeelString = ONDERDEELSTR_MODJE;
            break;
        case FTD_ONDERDEEL_PROFILE:
            onderdeelString = ONDERDEELSTR_PROFILE;
            break;
    }

    if (errcode == ERROR_UNKNOWN) {
        ftd_gui_dialog_show(onderdeelString, "Is de internetverbinding wel actief ?", parent, TRUE);
    } else if (errcode == ERROR_UNAUTH) {
        ftd_gui_dialog_show(onderdeelString, "Je hebt een ongeldige gebruikersnaam en/of wachtwoord\n"
                                             "ingevuld. Gelieve dit eerst in het configuratiescherm goed\n"
                                             "te zetten en daarna opnieuw proberen te updaten", parent, TRUE);
    } else if (errcode == ERROR_BAN) {
        ftd_gui_dialog_show(onderdeelString, "Je bent verbannen van de FTD server", parent, TRUE);
    } else if (errcode == ERROR_DB) {
        ftd_gui_dialog_show(onderdeelString, "Storing op de FTD Server. FTD Database onbereikbaar", parent, TRUE);
    } else if (errcode == ERROR_NEW) {
        ftd_gui_dialog_show(NULL, "Geen nieuwe FTD postings sinds laatste controle.\n"
                                  "De FTD postings die de vorige keer nieuw waren\n"
                                  "zullen nu getoond worden", parent, FALSE);
    } else if (errcode == ERROR_PLUGIN_UNSUPPORTED) {
        ftd_gui_dialog_show(NULL, "Plugins worden niet ondersteund op dit platform!", parent, TRUE);
    } else if (errcode == ERROR_PLUGIN_LOCATION) {
        ftd_gui_dialog_show(NULL, "De locatie van de http auth plugin is onbekend.\n"
                                  "Gelieve dit aan te passen in het configuratiescherm\n"
                                  "en het opnieuw te proberen", parent, TRUE);
    } else if (errcode == ERROR_PLUGIN_LOAD) {
        ftd_gui_dialog_show(NULL, "Kan de http auth plugin niet laden.\n"
                                  "Klopt de locatie wel en is het bestand leesbaar ?", parent, TRUE);
    } else if (errcode == ERROR_PLUGIN_EXECUTE) {
        ftd_gui_dialog_show(NULL, "Fout opgetreden tijdens het uitvoeren van de http auth plugin", parent, TRUE);
    } else if (errcode == ERROR_RES) {
        ftd_gui_dialog_show(onderdeelString, "Onbekende reactie van de server ontvangen", parent, TRUE);
    } else if (errcode == ERROR_PARSE) {
        char *tmp = g_strdup_printf("Het parsen van de gegevens is mislukt :\n%s", errmsg);
        ftd_gui_dialog_show(onderdeelString, tmp, parent, TRUE);
        g_free(tmp);
    } else if (errcode == ERROR_ORIGEVENT) {
        ftd_gui_dialog_show(onderdeelString, "Kan originele FTD event niet\nvinden in de lokale cache", parent, TRUE);
    } else if (errcode == ERROR_NOT_ON_SERVER) {
        ftd_gui_dialog_show(onderdeelString, "Gegevens zijn niet meer beschikbaar op de FTD server" , parent, TRUE);
    } else if (errcode == ERROR_NODATA) {
        if (onderdeel == FTD_ONDERDEEL_UPDATEN) {
            ftd_gui_dialog_show(onderdeelString, "Geen data van de server ontvangen\n"
                                                 "De FTD postings die de vorige keer nieuw\n"
                                                 "waren zullen nu getoond worden", parent, FALSE);
        } else {
            ftd_gui_dialog_show(onderdeelString, "Geen data van de server ontvangen", parent, TRUE);
        }
    } else if (errcode == ERROR_DNS || errcode == ERROR_DNS_PROXY) {
        if (onderdeel == FTD_ONDERDEEL_UPDATEN) {
            ftd_gui_dialog_show(onderdeelString, "DNS server onbereikbaar of host onbekend\n"
                                                 "De FTD postings die de vorige keer nieuw waren\n"
                                                 "zullen nu getoond worden", parent, TRUE);
        } else {
            ftd_gui_dialog_show(onderdeelString, "DNS server onbereikbaar of host onbekend", parent, TRUE);
        }
    } else if (errcode == ERROR_CONNECT) {
        if (onderdeel == FTD_ONDERDEEL_UPDATEN) {
            ftd_gui_dialog_show(onderdeelString, "Connection refused\n"
                                                 "De FTD postings die de vorige keer nieuw waren\n"
                                                 "zullen nu getoond worden", parent, TRUE);
        } else {
            ftd_gui_dialog_show(onderdeelString, "Connection refused", parent, TRUE);
        }
    } else if (errcode == ERROR_READ) {
        ftd_gui_dialog_show(onderdeelString, "Lezen van data van server mislukt", parent, TRUE);
    } else if (errcode == ERROR_SEND) {
        ftd_gui_dialog_show(onderdeelString, "Versturen van verzoek naar server mislukt", parent, TRUE);
    } else if (errcode == ERROR_TRANSFER_TIMEOUT) {
        ftd_gui_dialog_show(onderdeelString, "Maximumtijd voor ophalen gegevens verlopen", parent, TRUE);
    } else if (errcode == ERROR_SIGNUP_E0) {
        ftd_gui_dialog_show(onderdeelString, "Registreren is op dit moment niet mogelijk\n"
                                             "in verband met een ledenstop. Hou de pagina\n"
                                             "http://www.ftd4linux.2y.net/ledencount.php\n"
                                             "geregeld in de gaten om te zien wanneer je\n"
                                             "je weer kan registreren op FTD.", parent, FALSE);
    } else if (errcode == ERROR_SIGNUP_E1) {
        ftd_gui_dialog_show(onderdeelString, "Er is reeds iemand geregistreerd met de opgegeven gebruikersnaam", parent, TRUE);
    } else if (errcode == ERROR_SIGNUP_E2) {
        ftd_gui_dialog_show(onderdeelString, "Jouw ip-adres is verbannen van de FTD server", parent, TRUE);
    } else if (errcode == ERROR_SIGNUP_E3) {
        ftd_gui_dialog_show(onderdeelString, "Er is in de laatste 48 uur iemand ingelogd met een\n"
                                             "geldig FTD account vanaf je huidige IP adres", parent, FALSE);
    } else if (errcode == ERROR_CURL_INIT) {
        ftd_gui_dialog_show(onderdeelString, "curl_easy_init() mislukt\n"
                                             "Controleer of libcurl wel goed geinstalleerd is", parent, TRUE);
    } else if (errcode == ERROR_POST_CANCELLED) {
        ftd_gui_dialog_show(onderdeelString, "Server heeft de post geannuleerd", parent, TRUE);
    } else if (errcode == ERROR_POST_MODERATED) {
        ftd_gui_dialog_show(NULL, "Je post is ter beoordeling naar een moderator verstuurd", parent, FALSE);
    } else if (errcode == ERROR_UPDATE) {
        ftd_gui_dialog_show(onderdeelString, "Er is een nieuwere versie van OpenFTD nodig\n"
                                             "om gebruik te kunnen maken van de FTD server", parent, TRUE);
    } else if (errcode == ERROR_UPDATE_LIMIT) {
        ftd_gui_dialog_show(onderdeelString, "Er is momenteel een limitatie op de FTD server actief waardoor\n"
                                             "je maar 1 keer per 10 minuten mag updaten. De FTD postings\n"
                                             "die de vorige keer nieuw waren zullen nu getoond worden", parent, FALSE);
    } else if (errcode == ERROR_MODJE_DUPE_POST) {
        ftd_gui_dialog_show(onderdeelString, "Je hebt reeds een modje op deze post gewezen.", parent, FALSE);
    } else if (errcode == ERROR_MODJE_DUPE_FORUM) {
        ftd_gui_dialog_show(onderdeelString, "Je hebt reeds een modje op dit bericht gewezen.", parent, FALSE);
    } else if (errcode == ERROR_NO_SUCH_USER_KNOWN) {
        ftd_gui_dialog_show(onderdeelString, "De opgegeven gebruikersnaam is niet bekend op de FTD server.", parent, FALSE);
    } else if (errcode == ERROR_MSG) {
        char *tmp = g_strdup_printf("Servermededeling ontvangen: %s", errmsg);
        ftd_gui_dialog_show(onderdeelString, tmp, parent, TRUE);
        g_free(tmp);
    } else {
        fprintf(stderr, "ftd_gui_errhandler(): Ongeldige retval %i!\n", errcode);
        return;
   }

   // OnderdeelString moeten we NIET free'en aangezien dit define's zijn
}
