/*
 * att_remover -- for Claws Mail
 *
 * Copyright (C) 2005 Colin Leroy <colin@colino.net>
 *
 * Sylpheed is a GTK+ based, lightweight, and fast e-mail client
 * Copyright (C) 1999-2005 Hiroyuki Yamamoto and the Claws Mail Team
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifdef HAVE_CONFIG_H
#  include "config.h"
#endif

#include <string.h>

#include <glib.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>

#include "mainwindow.h"
#include "summaryview.h"
#include "folder.h"
#include "version.h"
#include "summaryview.h"
#include "procmime.h"
#include "alertpanel.h"
#include "inc.h"
#include "claws.h"
#include "plugin.h"

#include "pluginconfig.h"

static void remove_attachments(gpointer callback_data, guint callback_action, GtkWidget *widget)
{
	MainWindow *mainwin = mainwindow_get_mainwindow();
	SummaryView *summaryview = mainwin->summaryview;
	GSList *msglist = summary_get_selected_msg_list(summaryview);
	GSList *cur;
	gint msgnum = -1;

	if (summary_is_locked(summaryview) || !msglist) 
		return;
	
	if (g_slist_length(msglist) == 1) {
		if (alertpanel_full(_("Destroy attachments"),
                        _("Do you really want to remove all attachments from "
                          "the selected message ?\n\n"
			  "The deleted data will be unrecoverable."), 
			  GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL,
                          FALSE, NULL, ALERT_QUESTION, G_ALERTALTERNATE) != G_ALERTALTERNATE)
			return;
	} else {
		if (alertpanel_full(_("Destroy attachments"),
                        _("Do you really want to remove all attachments from "
                          "the selected messages ?\n\n"
			  "The deleted data will be unrecoverable."), 
			  GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL,
                          FALSE, NULL, ALERT_QUESTION, G_ALERTALTERNATE) != G_ALERTALTERNATE)
			return;
	}

	main_window_cursor_wait(summaryview->mainwin);
	gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
	folder_item_update_freeze();
	inc_lock();

	for (cur = msglist; cur; cur = cur->next) {
		MsgInfo *msginfo = (MsgInfo *)cur->data;
		MsgInfo *newmsg = NULL;
		MsgInfo *finalmsg = NULL;
		FolderItem *item = NULL;
		MimeInfo *info = NULL;
		MimeInfo *partinfo = NULL;

		MsgFlags flags = {0, 0};

		if (!msginfo)
			continue;
		
		item = msginfo->folder;
				
		newmsg = procmsg_msginfo_copy(msginfo);
		info = procmime_scan_message(newmsg);
	
		partinfo = info;
		while (partinfo && partinfo->type != MIMETYPE_TEXT) {
			partinfo = procmime_mimeinfo_next(partinfo);
		}
		
		if (!partinfo) {
			procmsg_msginfo_free(newmsg);
			continue;
		}
		partinfo->node->next = NULL;
		partinfo->node->children = NULL;
		info->node->children->data = partinfo;

		finalmsg = procmsg_msginfo_new_from_mimeinfo(newmsg, info);

		if (!finalmsg) {
			procmsg_msginfo_free(newmsg);
			continue;
		}

		debug_print("finalmsg %s\n", finalmsg->plaintext_file);
		
		flags.tmp_flags = msginfo->flags.tmp_flags;
		flags.perm_flags = msginfo->flags.perm_flags;
		flags.tmp_flags &= ~MSG_HAS_ATTACHMENT;

		folder_item_remove_msg(item, msginfo->msgnum);
		msgnum = folder_item_add_msg(item, finalmsg->plaintext_file, 
				&flags, TRUE);
		finalmsg->msgnum = msgnum;
		procmsg_msginfo_free(newmsg);
		procmsg_msginfo_free(finalmsg);
		
		newmsg = folder_item_get_msginfo(item, msgnum);
		if (newmsg && item) {
			procmsg_msginfo_unset_flags(newmsg, ~0, ~0);
			procmsg_msginfo_set_flags(newmsg, flags.perm_flags, flags.tmp_flags);
			procmsg_msginfo_free(newmsg);
		}
		
	}
	inc_unlock();
	folder_item_update_thaw();
	gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
	main_window_cursor_normal(summaryview->mainwin);
	g_slist_free(msglist);
	if (msgnum > 0) {
		summary_select_by_msgnum(summaryview, msgnum);
	}
}

static GtkItemFactoryEntry remove_att_menu = {
	N_("/Message/Remove attachments"),
	NULL,
	remove_attachments,
	0,
	NULL
};

static GtkItemFactoryEntry remove_att_context_menu = {
	N_("/Remove attachments"),
	NULL,
	remove_attachments,
	0,
	NULL
};

gint plugin_init(gchar **error)
{
	GtkItemFactory *ifactory;
	MainWindow *mainwin = mainwindow_get_mainwindow();
	SummaryView *summaryview = mainwin->summaryview;

	if( !check_plugin_version(MAKE_NUMERIC_VERSION(2,9,2,72),
				VERSION_NUMERIC, _("AttRemover"), error) )
		return -1;

	ifactory = gtk_item_factory_from_widget(mainwin->menubar);
	gtk_item_factory_create_item(ifactory, &remove_att_menu, mainwin, 1);
	gtk_item_factory_create_item(summaryview->popupfactory, &remove_att_context_menu, summaryview, 1);

	return 0;
}

gboolean plugin_done(void)
{
	GtkItemFactory *ifactory;
	MainWindow *mainwin = mainwindow_get_mainwindow();
	SummaryView *summaryview = NULL;
	GtkWidget *widget;

	if (mainwin == NULL)
		return TRUE;

	summaryview = mainwin->summaryview;
	ifactory = gtk_item_factory_from_widget(mainwin->menubar);
	widget = gtk_item_factory_get_widget(ifactory, remove_att_menu.path);
	gtk_widget_destroy(widget);
	gtk_item_factory_delete_item(ifactory, remove_att_menu.path);

	widget = gtk_item_factory_get_widget(summaryview->popupfactory, remove_att_context_menu.path);
	gtk_widget_destroy(widget);
	gtk_item_factory_delete_item(summaryview->popupfactory, remove_att_context_menu.path);
	return TRUE;
}

const gchar *plugin_name(void)
{
	return _("AttRemover");
}

const gchar *plugin_desc(void)
{
	return _("This plugin removes attachments from mails.\n\n"
		 "Warning: this operation will be completely "
		 "un-cancellable and the deleted attachments will "
		 "be lost forever, and ever, and ever.");
}

const gchar *plugin_type(void)
{
	return "GTK2";
}

const gchar *plugin_licence(void)
{
		return "GPL3+";
}

const gchar *plugin_version(void)
{
	return PLUGINVERSION;
}

struct PluginFeature *plugin_provides(void)
{
	static struct PluginFeature features[] = 
		{ {PLUGIN_UTILITY, N_("Attachment handling")},
		  {PLUGIN_NOTHING, NULL}};
	return features;
}


syntax highlighted by Code2HTML, v. 0.9.1