#!/usr/bin/env python
from gi.repository import Gtk, Gdk, GObject
import os
import xmlrpclib
import sys
import pwd
import time
import cups
import gettext
_=gettext.gettext
gettext.textdomain('printa')
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
class PrintaGUI:
	
	def __init__(self,job):
		
		self.client_url="https://localhost:9779"
		self.client=xmlrpclib.ServerProxy(self.client_url)
		self.gui_user=os.environ["USER"]
		self.client.create_ticket("","NTicketsManager",self.gui_user)
		f=open("/run/n4d/tickets/"+self.gui_user)
		password=f.readline()
		f.close()
		self.gui_user_info=(self.gui_user,password)
		
		try:
			url=self.client.get_variable("","VariablesManager","PRINTACLIENTCONFIG")["server"]
		except Exception as e:
			print e
			url="localhost"
		
		self.server_url="https://%s:9779"%url
		self.server=xmlrpclib.ServerProxy(self.server_url)
		
		try:
			'''
			f=open("/tmp/printa","w")
			f.write(str(os.environ))
			f.close()		
			'''
			
			
			self.job=job
			self.printed=False
			self.info=self.client.get_job("","Printa",self.job)
			user_info=pwd.getpwnam(os.environ["USER"])
			self.user_uid=str(user_info.pw_uid)
			self.user_name=os.environ["USER"]
			#self.start_gui()
			self.start_login_gui()
			Gtk.main()
		except Exception as e:
			f=open("/tmp/printa","a")
			f.write("\n")
			f.write(str(e))
			f.close()
			raise e
			
		
	#def init
	
	def start_login_gui(self):
		
		builder=Gtk.Builder()
		builder.set_translation_domain("printa")
		builder.add_from_file("/usr/share/printa/rsrc/printa-gui.glade")
		
		self.login_window=builder.get_object("loginwindow")
		self.login_window.connect("destroy",self.close_app)
		self.user_login_entry=builder.get_object("user_login_entry")
		self.user_password_entry=builder.get_object("user_password_entry")
		
		self.user_login_entry.set_text(self.user_name)
		
		self.accept_login_button=builder.get_object("accept_login_button")
		self.cancel_login_button=builder.get_object("cancel_login_button")
		self.accept_login_button.connect("clicked",self.accept_login_clicked)
		self.cancel_login_button.connect("clicked",self.cancel_login_clicked)
		
		self.login_msg=builder.get_object("msg_label")
		
		self.login_window.show()
		
		
	#def start_login_gui
	
	def accept_login_clicked(self,widget):
		try:
			ret=self.server.validate_user(self.user_login_entry.get_text(),self.user_password_entry.get_text())
			
			if ret[0]:
				self.login_window.hide()
				self.user_name=self.user_login_entry.get_text()
				self.user_password=self.user_password_entry.get_text()
				self.user_info=(self.user_name,self.user_password)
				self.start_gui()
			if not ret[0]:
				txt=""
				txt+="Authentication error"
				txt+=""		
				
				self.login_msg.set_markup(txt)
				
		except Exception as e:
			
			txt=""
			txt+="Error conecting to %s"%self.server_url + " :\n" + str(e)
			txt+=""		
				
			self.login_msg.set_markup(txt)
			
		
	#def accept_login_clicked
	
	def cancel_job(self):
		try:
			cups_conn=cups.Connection()
			cups_conn.cancelJob(int(self.job))		
		except:
			pass
	#def cancel_job
	
	def cancel_login_clicked(self,widget):
		
		self.cancel_job()
		self.close_app(None)
		
	#def cancel_login_clicked
	
	def start_gui(self):
		
		builder=Gtk.Builder()
		builder.set_translation_domain("printa")
		builder.add_from_file("/usr/share/printa/rsrc/printa-gui.glade")
		
		self.window=builder.get_object("window1")
		self.user_entry=builder.get_object("user_entry")
		self.user_quota_entry=builder.get_object("quota_entry")
		self.change_user_button=builder.get_object("change_user_button")
		
		self.cancel_button=builder.get_object("cancel_button")
		self.print_button=builder.get_object("print_button")
		self.main_text_label=builder.get_object("main_text_label")
		self.status_text_label=builder.get_object("status_text_label")
		self.treeview=builder.get_object("history_treeview")
		self.password_box=builder.get_object("password_box")
		self.password_entry=builder.get_object("password_entry")
		self.passwd_label=builder.get_object("passwd_label")
		
		self.window.show_all()
		
		self.set_values()
		
		
		
		self.window.connect("destroy",self.close_app)
		self.cancel_button.connect("clicked",self.cancel_clicked)
		self.print_button.connect("clicked",self.print_clicked)
		self.change_user_button.connect("clicked",self.change_user_clicked)
		
		
		#Gtk.main()
		
	#def start_gui
	
	def change_user_clicked(self,widget):
		
		print("CHANGE USER CLICKED...")
		self.window.hide()
		self.start_login_gui()
		
	#def change_user_clicked
	
	def print_clicked(self,widget):
		print("PRINTING...")
		
		try:
			if self.use_password:
				ret=self.server.validate_password("","PrintaServer",self.user_name,self.password_entry.get_text())
				if not ret:
					txt=""
					txt+="Wrong user password"
					txt+=""
					self.status_text_label.set_markup(txt)
					
				else:
					self.status_text_label.set_markup("")
					self.client.set_response(self.gui_user_info,"Printa","",self.job,1) 
					self.print_button.set_sensitive(False)
					self.cancel_button.set_sensitive(False)
					self.printed=True
					self.update_user_info()
					self.close_app(None)
			else:
				self.client.set_response(self.gui_user_info,"Printa","",self.job,1) 
				self.print_button.set_sensitive(False)
				self.cancel_button.set_sensitive(False)
				self.printed=True
				self.update_user_info()
				self.close_app(None)
					
		except Exception as e:
			self.status_text_label.set_markup(str(e))
			self.print_button.set_sensitive(False)
			self.cancel_button.set_sensitive(False)
			self.client.set_response(self.gui_user_info,"Printa","",self.job,0)
			self.printed=False
			self.update_user_info()
			
			
		
	#def print_clicked
	
	def cancel_clicked(self,widget):
		
		
			
		try:
			self.client.set_response(self.gui_user_info,"Printa","",self.job,0)
				
			self.update_user_info()
				
		except Exception as e:
			print e
			
		print 4
		self.close_app(None)
		
	#def cancel_clicked
	
	def update_user_info(self):
		
		if self.printed:
			self.info["status"]="completed"
			if not self.server.has_freepass("","PrintaServer",self.user_name):
				self.server.substract_user_quota(self.user_info,"PrintaServer",self.user_name,self.info["pages"])
		else:
			self.info["status"]="cancelled"
			
		
		self.server.add_job_history(self.user_info,"PrintaServer",self.user_name,self.info)
	
	def get_error_text(self,status):
		
		if status==-1:
			return _("Not a valid user.")
		
		if status==-2:
			return _("This user is not allowed to print.")
			
		if status==-3:
			return _("User quota is not enough to print this job.")
			
		
		
		return _("Unknown error.")
		
	#def get_error_text
	
	def set_values(self):
		
		self.password_box.hide()
		self.user_entry.set_text(self.user_name)
		
		
		self.status_text_label.set_text("")
		
		self.history_liststore=Gtk.ListStore(str,str,str,str,str,str)
		self.treeview.set_model(self.history_liststore)
		column=Gtk.TreeViewColumn(_("Job ID"))
		renderer=Gtk.CellRendererText()
		column.pack_start(renderer,True)
		column.add_attribute(renderer,"text",0)
		self.treeview.append_column(column)
		column=Gtk.TreeViewColumn(_("Job Name"))
		renderer=Gtk.CellRendererText()
		column.pack_start(renderer,True)
		column.add_attribute(renderer,"text",1)
		self.treeview.append_column(column)
		column=Gtk.TreeViewColumn(_("# of pages"))
		renderer=Gtk.CellRendererText()
		column.pack_start(renderer,True)
		column.add_attribute(renderer,"text",2)
		self.treeview.append_column(column)
		column=Gtk.TreeViewColumn(_("Date"))
		renderer=Gtk.CellRendererText()
		column.pack_start(renderer,True)
		column.add_attribute(renderer,"text",3)
		self.treeview.append_column(column)
		column=Gtk.TreeViewColumn(_("Status"))
		renderer=Gtk.CellRendererText()
		column.pack_start(renderer,True)
		column.add_attribute(renderer,"text",4)
		self.treeview.append_column(column)
		column=Gtk.TreeViewColumn(_("Printer"))
		renderer=Gtk.CellRendererText()
		column.pack_start(renderer,True)
		column.add_attribute(renderer,"text",5)
		self.treeview.append_column(column)
		self.populate_treeview()
		
		txt=""
		txt+=""+_("Job #").decode("utf-8")+": " + self.info["job"] + "\n"
		txt+=""+_("Job name").decode("utf-8")+": " + self.info["job_name"] + "\n"
		txt+=""+_("Pages").decode("utf-8")+": " + str(self.info["pages"]) + "\n"
		txt+=""+_("Printer").decode("utf-8")+": " + self.info["printer"] + "\n"
		
		tmp_info=self.info
		tmp_info["user"]=self.user_name
		status,info=self.server.check_if_printable("","PrintaServer",tmp_info)
		
		self.user_quota_entry.set_text(str(self.server.get_user_quota("","PrintaServer",self.user_name)))
		
		self.info["status"]=info
		
		if self.info["status"]==0:
			txt+="\n"+_("Continue?").decode("utf-8")+""
			
			
			ret=self.server.is_password_needed("","PrintaServer",self.user_name)
			#txt+="is_password_needed %s"%str(ret)
			
			self.use_password=False
			
			if ret:
				#txt+="\ne1e1e1e1e1"
				self.use_password=True
				self.password_box.show()
				
			
				
		else:
			self.print_button.set_sensitive(False)
			txt+="\n\t\t"
			#txt+="You are not allowed to print due to: "
			txt+=self.get_error_text(self.info["status"]).decode("utf-8")
			txt+=""
			#txt+=str(self.info)
			txt+="\n"
		
		
		
		self.main_text_label.set_markup(txt)
		
	#def set_values
	
	def populate_treeview(self):
		
		self.history_liststore.clear()
		
		ret=self.server.get_user_history("","PrintaServer",self.user_name)
		
		#self.status_text_label.set_text(str(ret))
		
		lst=[]
		for item in ret:
			try:
				job_id=item["job"]
				job_name=item["job_name"]
				pages=str(item["pages"])
				date=time.strftime("%d/%m/%y", time.localtime(int(item["time"])))
				status=item["status"]
				printer=item["printer"]
				
				lst.append([job_id,job_name,pages,date,status,printer])
				
			except Exception as e:
				#self.status_text_label.set_text(str(e))
				pass
		for item in lst:
			id,name,pages,date,status,printer=item
			self.history_liststore.append((id,name,pages,date,status,printer))
		
	#def populate_treeview
	
	def close_app(self,widget):
		
		Gtk.main_quit()
		
	#def close_app
	
	
#class PrintaGUI
if __name__=="__main__":
	
	p=PrintaGUI(sys.argv[1])