import deskbar.interfaces.Action
import deskbar.interfaces.Match
import deskbar.core.Utils
import deskbar.interfaces.Module
from deskbar.core.GconfStore import GconfStore

import dbus
import dbus.glib

import logging

import gtk

import xmlrpclib

HANDLERS = ["TracHandler"]
LOGGER = logging.getLogger(__name__)

TRAC_ICON = [
"22 22 127 2",
"  	c None",
". 	c #C66969",
"+ 	c #E1AEAE",
"@ 	c #B02E2E",
"# 	c #D28989",
"$ 	c #EDD1D1",
"% 	c #BD4F4F",
"& 	c #D28888",
"* 	c #E3B7B7",
"= 	c #D28787",
"- 	c #E5BABA",
"; 	c #E3B4B4",
"> 	c #D38A8A",
", 	c #B53939",
"' 	c #C15959",
") 	c #DBA1A1",
"! 	c #B12F2F",
"~ 	c #B43838",
"{ 	c #C56666",
"] 	c #D18787",
"^ 	c #CD7D7C",
"/ 	c #BC4C4C",
"( 	c #AB1F1F",
"_ 	c #AC2121",
": 	c #AE2727",
"< 	c #CA7575",
"[ 	c #CC7878",
"} 	c #B33434",
"| 	c #B63D3D",
"1 	c #CB7575",
"2 	c #BD5050",
"3 	c #D79595",
"4 	c #C15B5B",
"5 	c #DB9797",
"6 	c #B33232",
"7 	c #BF5656",
"8 	c #C05858",
"9 	c #AC2020",
"0 	c #B94646",
"a 	c #B84343",
"b 	c #DAA0A0",
"c 	c #C05353",
"d 	c #AD2424",
"e 	c #B12E2E",
"f 	c #E0AFAF",
"g 	c #B94343",
"h 	c #C66666",
"i 	c #D08585",
"j 	c #CD7C7C",
"k 	c #B02B2B",
"l 	c #C05959",
"m 	c #D79796",
"n 	c #AD2222",
"o 	c #AF2928",
"p 	c #D48D8D",
"q 	c #CF8181",
"r 	c #CB7676",
"s 	c #C76C6C",
"t 	c #C05757",
"u 	c #B23030",
"v 	c #E7C2C2",
"w 	c #BE5151",
"x 	c #DFABAB",
"y 	c #B02D2D",
"z 	c #CF8180",
"A 	c #D49392",
"B 	c #B23231",
"C 	c #C96F6F",
"D 	c #B43535",
"E 	c #AD2323",
"F 	c #B23131",
"G 	c #DB9F9F",
"H 	c #F0D6D6",
"I 	c #CA7272",
"J 	c #AC2222",
"K 	c #C56A69",
"L 	c #DCA1A1",
"M 	c #E6BDBD",
"N 	c #D99D9D",
"O 	c #E3B8B8",
"P 	c #D99B9B",
"Q 	c #C36060",
"R 	c #AD2626",
"S 	c #D69594",
"T 	c #C35F5F",
"U 	c #AF2929",
"V 	c #B84747",
"W 	c #D08282",
"X 	c #C86E6E",
"Y 	c #E4B7B7",
"Z 	c #D89B9B",
"` 	c #AE2525",
" .	c #B74141",
"..	c #C56363",
"+.	c #BC4B4B",
"@.	c #B94545",
"#.	c #E3B5B5",
"$.	c #EDD2D2",
"%.	c #CD7979",
"&.	c #C04F4F",
"*.	c #D08484",
"=.	c #C25C5C",
"-.	c #CF8282",
";.	c #AF2A2A",
">.	c #B43737",
",.	c #CA7373",
"'.	c #DA9F9F",
").	c #AE2626",
"!.	c #B84040",
"~.	c #CF7F7F",
"{.	c #BD4E4E",
"].	c #AF2828",
"^.	c #C66867",
"/.	c #CA7171",
"(.	c #B33535",
"_.	c #D79696",
":.	c #AE2828",
"<.	c #B94444",
"[.	c #CF807F",
"}.	c #D99A9A",
"|.	c #DCA4A3",
"1.	c #DEA6A6",
"2.	c #B63C3C",
"3.	c #B73F3F",
"4.	c #D69191",
"5.	c #CC7979",
"6.	c #D79494",
"                      .                     ",
"                    + @ #                   ",
"                    $ % &                   ",
"      * =             - ;                   ",
"      > , '         ) ! ~ {                 ",
"        ] ^         / ( _ : <               ",
"        [ } | 1     2 _ _ _ '   3 4         ",
"      5 6 _ _ 7     8 _ _ 9 0   1 a b       ",
"      c d _ _ e f   g _ _ _ h     i         ",
"      j k _ _ _ l   m n _ o p   q ! r       ",
"    s   t _ _ _ u v   . 9 w   x ! _ y z     ",
"  A B C   C D E F x     G H   I _ _ J K     ",
"    L M N O   P C             Q _ _ R S     ",
"      T U V           W X Y   Z ` _  .      ",
"      .._ _ +.      % _ _ @.#.$.%.&.*.      ",
"      =._ _ d -.    ;._ _ J >.,.            ",
"      ' _ _ E ..  '.)._ _ _ _ n !.~.        ",
"        {.E ].^.  w 9 _ _ _ _ _ _ /.        ",
"          q = $.C _ _ _ _ J d d (._.        ",
"                g _ _ :.<.[.}.|.1.          ",
"                2.E 3.,.                    ",
"                4.5.6.                      "]

GCONF_TRAC_URL = GconfStore.GCONF_DIR + "/trac_url"

class TracAction(deskbar.interfaces.Action):
  """The action that handles task addition.
  """

  def __init__(self, text):
    deskbar.interfaces.Action.__init__(self, text)
    self.text = text
    
  def get_verb(self):
    return "New Trac Ticket"
    
  def get_icon(self):
    return "gtk-add"

  def activate(self, text):
    #read config values via gconf
    client = GconfStore.get_instance().get_client()
    url = client.get_string(GCONF_TRAC_URL)
    try:
      server = xmlrpclib.ServerProxy(url)
      server.ticket.create(
          text, # short summary
          "",  # description
          {
            "owner" : "chassing", 
            'status' : 'assigned'
          }
      )
    except Exception, err:
      LOGGER.error(err)


  def skip_history(self):
    """Dont save this action please.
    """
    return True

  
class TracMatch(deskbar.interfaces.Match):
  """match search string and return actions
  """
  def __init__(self, text, **kwargs):
    deskbar.interfaces.Match.__init__(self,
      name=text,
      pixbuf=gtk.gdk.pixbuf_new_from_xpm_data(TRAC_ICON),
      category="actions", **kwargs)
    self.text = text
    self.add_action(TracAction(text), is_default=True)
    
  def get_hash(self):
    return "trac-%s" % self.text


class TracHandler(deskbar.interfaces.Module):
  """The handler that will find, return a respond to queries.
  """

  INFOS = {'icon': gtk.gdk.pixbuf_new_from_xpm_data(TRAC_ICON),
    'name': "Trac",
    'description': "Add quick ticket into trac via xmlrpc",
    'version': '0.1.0.0',
  }
  
  def __init__(self):
    deskbar.interfaces.Module.__init__(self)
    client = GconfStore.get_instance().get_client()
    if not client.get_string(GCONF_TRAC_URL):
      client.set_string(GCONF_TRAC_URL,
          "http://username:password@trac.your.domain/trac/login/xmlrpc")
    
  def query(self, text):
    """ Respond to a deskbar query
    """
    self._emit_query_ready(text, [TracMatch(text)])
    
  def has_config(self):
    return False
