#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
import sys
import commands
from xml.dom.minidom import Document
from xml.dom import minidom
from PyQt4 import QtGui, QtCore

__version__ = "0.1-2"

class CallBlock(QtGui.QMainWindow):
	def __init__(self, parent=None):
		QtGui.QMainWindow.__init__(self, parent)
		self.setWindowTitle('Call and text block')
		a_addn = QtGui.QAction('Add new', self)
		self.connect(a_addn, QtCore.SIGNAL("triggered()"), self.AddNewNumber)
		a_deln = QtGui.QAction('Delete entries', self)
		self.connect(a_deln, QtCore.SIGNAL("triggered()"), self.DeleteNumber)
		a_slog = QtGui.QAction('Show log', self)
		a_sett = QtGui.QAction('Settings', self)
		a_exit = QtGui.QAction('Exit', self)
		a_about = QtGui.QAction('About CATblock', self)
		self.connect(a_about, QtCore.SIGNAL("triggered()"), self.ShowAbout)
		self.statusBar().showMessage("Early development release [v %s]. Report bugs to lukasz@raczylo.com" % __version__)
		menubar = self.menuBar()
		doit = menubar.addAction(a_addn)
		doit = menubar.addAction(a_deln)
		doit = menubar.addAction(a_slog)
		doit = menubar.addAction(a_about)
		doit = menubar.addAction(a_exit)
		doit = menubar.addAction(a_exit)
		self.mainWidget=QtGui.QWidget(self) 
		self.mainWidget.resize(800, 350)
		self.lister = QtGui.QListWidget(self.mainWidget)
		self.lister.resize(800, 350)
		self.mainLayout=QtGui.QVBoxLayout(self.mainWidget)
		self.label = QtGui.QLabel("", self.mainWidget)
		self.CreateList()

	def ShowAbout(self):
		self.lister.hide()   
		self.label = QtGui.QLabel("""<h3>Thanks for using CAT block v%s!</h3>This is only early development release, and there may be a lot of bugs.<br />
	However You can be sure that CATblock meets its basic functionality.<br />Don't forget to visit <a href=\"http://code.google.com/p/maemo-catblock/\">http://code.google.com/p/maemo-catblock/</a><br />for the latest version.""" % __version__, self.mainWidget)
		self.label.resize(800, 350)
		self.label.show()

	def DeleteNumber(self):
		self.CreateListToDel()

	def CreateListToDel(self):
		self.lister.hide()
		self.lister.show()
		self.label.hide()
		self.lister.clear()
		numbers = self.ListNumbers()
		if numbers:
			for n in numbers:
				ct = commands.getoutput('grep -c ":%s:" /home/user/MyDocs/.callblacklist.log' % n)
				QtGui.QListWidgetItem("  %s\t\tblocked %s times" % (n, ct), self.lister)
		self.connect(self.lister, QtCore.SIGNAL("itemClicked(QListWidgetItem *)"), self.CheckDelete)
		self.lister.update()
 
	def CheckDelete(self, item):
		self.RemoveNumberFromList(item.text())

	def CreateList(self):
		self.lister.hide()
		self.lister.show()
		self.label.hide()
		self.lister.clear()
		numbers = self.ListNumbers()
		if numbers:
			for n in numbers:
				ct = commands.getoutput('grep -c ":%s:" /home/user/MyDocs/.callblacklist.log' % n)
				QtGui.QListWidgetItem("  %s\t\tblocked %s times" % (n, ct), self.lister)
		self.lister.update()

	def ListNumbers(self):
		mynumbers = []
		try:
			doc = minidom.parse('/home/user/MyDocs/.callblocklist.xml')
			root = doc.childNodes[0]
			for n in root.getElementsByTagName('number'):
				try:
					mynumbers.append(n.firstChild.wholeText)
				except:
					None
			return mynumbers
		except:
			QtGui.QMessageBox.critical(self, 'Empty blacklist', 'Blacklist seems to be empty.. Feed me...', QtGui.QMessageBox.NoButton)
     		return 0

	def AddNewNumber(self):
		number, ok = QtGui.QInputDialog.getText(self, "Enter number to block", "Enter number to block connections / texts from")   
		if ok:
			self.AddNumberToList(number)

	def RemoveNumberFromList(self, phone_number):
		phone_number = phone_number.replace(" ", "")
		try:
			reply = QtGui.QMessageBox.question(self, 'Are you sure?', 'Really remove %s from blacklist?' % re.search(r'(\S+)\s',phone_number).group(0).replace(" ", "").replace("\t", ""), QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
			if reply == QtGui.QMessageBox.Yes:
				mynumbers = []
				doc2 = minidom.parse('/home/user/MyDocs/.callblocklist.xml')
				root = doc2.childNodes[0]
				for n in root.getElementsByTagName('number'):
					m = re.search(r'(\S+)\s',phone_number).group(0).replace(" ", "")
					if m.replace("\t","").replace(" ","") != n.firstChild.wholeText.replace(" ",""):
						mynumbers.append(n.firstChild.wholeText)
				doc = Document()
				root = doc.createElement('root')
				doc.appendChild(root)
				for n in mynumbers:
					number = doc.createElement("number")
					root.appendChild(number)
					number2 = doc.createTextNode(str(n))
					number.appendChild(number2)
			 		doc.appendChild(root)
				tf = open('/home/user/MyDocs/.callblocklist.xml', "w")
				doc.writexml(tf)
				tf.close()
				QtGui.QMessageBox.critical(self, 'Configuration saved', 'New blacklist has been saved and reloaded.', QtGui.QMessageBox.NoButton)
		except:
			QtGui.QMessageBox.critical(self, 'Empty blacklist', 'Blacklist seems to be empty...', QtGui.QMessageBox.NoButton)
		self.CreateList()

	def AddNumberToList(self, phone_number):
		phone_number = phone_number.replace(" ", "")
		try:
			doc = minidom.parse('/home/user/MyDocs/.callblocklist.xml')
			root = doc.childNodes[0]
		except:
			doc = Document()
			root = doc.createElement('root')
			doc.appendChild(root)
		number = doc.createElement("number")
		root.appendChild(number)
		number2 = doc.createTextNode(str(phone_number))
		number.appendChild(number2)
		doc.appendChild(root)
		tf = open('/home/user/MyDocs/.callblocklist.xml', "w")
		doc.writexml(tf)
		tf.close()
		QtGui.QMessageBox.critical(self, 'Number added', 'Number %s is from now blacklisted.' % phone_number, QtGui.QMessageBox.NoButton)
		self.CreateList()

if __name__ == '__main__':
	app = QtGui.QApplication(sys.argv)
	cb = CallBlock()
	cb.showMaximized()
	sys.exit(app.exec_())
