# GNU Solfege - free ear training software
# Copyright (C) 2005, 2007 Tom Cato Amundsen
#
# 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 2 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., 51 Franklin ST, Fifth Floor, Boston, MA  02110-1301  USA

import sys
import string
import urllib2
import random
import gtk

import gu
import runtime
import configureoutput
import pmwiki
import utils
import cfg

RESPONSE_SEND = 1011
RESPONSE_SEE = 1010

class ShowTextDialog(gtk.Dialog):
    def __init__(self, parent, text):
        gtk.Dialog.__init__(self, _("Bug report"), parent,
            buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
        self.add_button(_("_Send"), RESPONSE_SEND)
        self.set_default_size(600, 500)
        sc = gtk.ScrolledWindow()
        self.vbox.pack_start(sc)
        sc.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self.g_tw = gtk.TextView()
        self.g_tw.set_wrap_mode(gtk.WRAP_WORD)
        self.g_tw.set_editable(False)
        buf = self.g_tw.get_buffer()
        buf.insert(buf.get_end_iter(), text)
        sc.add(self.g_tw)
        self.show_all()

class ReportBugWindow(gtk.Dialog):
    def __init__(self, parent, error_text):
        gtk.Dialog.__init__(self, _("Make bug report"), parent,
                buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
        self.m_error_text = error_text
        self.add_button(_("See complete _report"), RESPONSE_SEE)
        self.add_button(_("_Send"), RESPONSE_SEND)
        self.set_default_size(400, 400)
        sizegroup = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
        self.g_email = gtk.Entry()
        self.vbox.pack_start(
            gu.hig_label_widget(_("_Email:"), self.g_email, sizegroup),
            False)
        self.g_mangled_email = gtk.Label()
        self.vbox.pack_start(
            gu.hig_label_widget(_("Mangled email address:"), self.g_mangled_email,
                sizegroup), False)
        self.g_email.set_text(cfg.get_string('user/email'))
        self.g_email.connect('changed', self.on_update_mangle)
        self.g_description = gtk.Entry()
        self.vbox.pack_start(
            gu.hig_label_widget(_("S_hort description:"), self.g_description,
                     sizegroup), False)
        label = gtk.Label(_("_Describe how to produce the error message:"))
        label.set_use_underline(True)
        label.set_alignment(0.0, 0.5)
        self.vbox.pack_start(label, False)
        self.g_tw = gtk.TextView()
        self.g_tw.set_wrap_mode(gtk.WRAP_WORD)
        self.g_tw.set_border_width(10)
        # translators, please notice that the word NO_DESCRIPTION must not be
        # translated in this string.
        self.g_tw.get_buffer().insert_at_cursor(_("""Describe as exactly as you can what you did when this error occurred. If you give no description at all, you make it very difficult to track down this bug. You should replace this text with your description, and also remove the "bug-tag" in the bottom of this text so that this bug is not automatically sorted among the bug reports with no description.\n\n(bug-tag: NO_DESCRIPTION)"""))
        label.set_mnemonic_widget(self.g_tw)
        self.vbox.pack_start(self.g_tw)
        self.show_all()
    def on_update_mangle(self,  *v):
        cfg.set_string('user/email', self.g_email.get_text())
        self.g_mangled_email.set_text(utils.mangle_email(self.g_email.get_text()))
    def send_bugreport(self):
        """
        Return None if successful. Return the urllib2 execption if failure.
        """
        pagename = self.g_description.get_text()
        pagename = "".join([s.capitalize() for s in pagename.split()])
        if not pagename:
            pagename = "NoDescription"
        pagename = "SITS-Incoming.%s" % pagename
        wiki = pmwiki.PmWiki("http://www.solfege.org")
        add_str=""
        try:
            while 1:
                if wiki.page_exists(pagename+add_str):
                    if not add_str:
                        add_str = "-"
                    add_str += random.choice(string.ascii_letters)
                    continue
                else:
                    wiki.write_page(pagename+add_str, self.get_bugreport(), "Solfege")
                break
        except urllib2.URLError, e:
            return e
    def get_bugreport(self):
        email = utils.mangle_email(self.g_email.get_text())
        buf = self.g_tw.get_buffer()
        description = buf.get_text(buf.get_start_iter(), buf.get_end_iter())
        try:
            windowsversion = str(sys.getwindowsversion())
        except AttributeError:
            windowsversion = "(not running ms windows)"
        return "\n".join([
            "!%s" % self.g_description.get_text(),
            "Submitter: %s\\\\" % email,
            "Long desciption: %s\n" % description,
            "||border=1",
            "|| Solfege version||%s ||" % configureoutput.VERSION_STRING,
            "|| runtime.has_gtkhtml2||%s ||" % runtime.has_gtkhtml2(),
            "|| gtk.pygtk_version||%s ||" % str(gtk.pygtk_version),
            "|| gtk||%s ||" % gtk,
            "|| sys.version_info||%s||" % str(sys.version_info),
            "|| sys.version||%s||" % sys.version.replace("\n", ""),
            "|| sys.prefix||%s||" % sys.prefix,
            "|| sys.platform||%s||" % sys.platform,
            "|| windowsversion||%s||" % windowsversion,
            "\n",
            "Message from stderr:",
            " %apply=block bgcolor=silver margin=1em padding=1em border='1px dashed black'%[=",
            self.m_error_text,
            "=]",
            ])


