#! /usr/bin/python
# -*- coding: iso-8859-1 -*-

#####################################################
#    Copyright (C) 2006 by Cesar Kallas   	
#    cesarkallas@soulivre.org   
#    http://cesarkallas.soulivre.org
#                                                                          
#    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.,                                       
#    59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             
#####################################################

import Opcoes, Acoes, Log, MacAddress, Ambiente, Atualizacoes, BancoDados as SQLite
import UIConectaAgente
import sys, qt, datetime, thread, xmlrpclib

class Interface(object):
	def __init__(self):
		self.log = Ambiente.log
		
		self.acoes = Acoes.Acoes()
		self.atualizacoes = Atualizacoes.Atualizacoes()
		
		self.ui = UIConectaAgente.Conecta_Agente()
		self.__slots()
		
		self.ui.botaoExecutarAcoes.setEnabled(False)
		
		# Seta o Mac Address na Janela
		self.ui.labelMacAddress.setText(str(Ambiente.mac_address))
		
		# Checa por atualizacoes
		self.__ChecarAtualizacoes(avisos=-1)
		
		# Seta a ultima atualização 
		self.ui.labelUltimaAtualizacao.setText(str(Ambiente.ultimaAtualizacao))
		
		# Ajusta barra de instalacao
		self.ui.progressBarExecutandoAcao.setTotalSteps (100)
	


	def __slots(self):
		self.ui.connect(self.ui.botaoAcoes, qt.SIGNAL('clicked()'), self.__acoes)
		self.ui.connect(self.ui.botaoExecutarAcoes, qt.SIGNAL('clicked()'), self.__executarAcoes)
		self.ui.connect(self.ui.botaoInventario, qt.SIGNAL('clicked()'), self.__inventario)
		self.ui.connect(self.ui.botaoLog, qt.SIGNAL('clicked()'), self.__log)
		self.ui.connect(self.ui.botaoChecarAtualizacoes, qt.SIGNAL('clicked()'), self.__ChecarAtualizacoes)
		self.ui.connect(self.ui.comboAcoes, qt.SIGNAL("activated(int)"), self.__acoes)
		self.ui.connect(self.ui.botaoExecutandoAcoesFechar, qt.SIGNAL("clicked()"), self.__ChecarAtualizacoes)


	def __ChecarAtualizacoes(self, avisos=None):
		atualizacoes = self.atualizacoes.buscar()
		self.ui.botaoExecutarAcoes.setEnabled(False)
		if atualizacoes > 0:
			self.ui.botaoExecutarAcoes.setEnabled(True)
			Ambiente.ultimaAtualizacao = datetime.date.today()
			self.ui.labelUltimaAtualizacao.setText(str(Ambiente.ultimaAtualizacao))
			if avisos == None:
				qt.QMessageBox.information(None, "ConectaAgente", qt.QString("Novas atualizações disponíveis!"))
		elif atualizacoes == -101:
			if avisos == None:
				qt.QMessageBox.information(None, "ConectaAgente", qt.QString("Sem atualizações no momento!"))
		else:
			if avisos == None:
				qt.QMessageBox.critical(None, "ConectaAgente", qt.QString("Falha ao buscar atualizações!"))
		self.__acoes()


	def __executarAcoes(self):
		# Busca acoes disponiveis
		self.ui.widgetStackCentral.raiseWidget(self.ui.wStackExecutandoAcao)
		qt.QMessageBox.information(None, "ConectaAgente", qt.QString("Iniciando..."))
		Ambiente.uiAgente.textExecutandoAcao.clear()
		
		acoes = self.acoes.exporta("agendada")
		#qt.QMessageBox.information(None, "ConectaAgente", qt.QString("Sem atualizações no momento!"))
		if acoes == -1:
			self.log.error("JanelaAcoes: Falha ao buscar acoes disponiveis")
		else:
			for acao in acoes:
				Ambiente.uiAgente.progressBarExecutandoAcao.reset ()
				self.ui.labelComponente.setText(qt.QString(acao["software_nomeArquivo"]))
				self.ui.labelAcao.setText(qt.QString(acao["acao"]))
				resposta = self.acoes.executa(acao["acao_id"])
				print resposta
		#self.__acoes()


	def __acoes(self):
		# Exibe janela interna de acoes
		self.ui.widgetStackCentral.raiseWidget(self.ui.wStackAcoes)
		
		# Verifica acoes desejadas
		status = str(self.ui.comboAcoes.currentText())
		if status == "Pendentes":
			status = "agendada"
		elif status == "Executadas":
			status = "executada"
		else:
			status = None
		
		# Busca acoes disponiveis
		acoes = self.acoes.exporta(status)
		
		if acoes == -1:
			self.log.error("JanelaAcoes: Falha ao buscar acoes disponiveis")
		else:
			self.ui.tabelaAcoes.setNumRows(0)
			linha = 0
			for acao in acoes:
				self.ui.tabelaAcoes.insertRows(linha, 1)
				self.ui.tabelaAcoes.setText(linha, 0, qt.QString(acao["acao_id"]))
				self.ui.tabelaAcoes.hideColumn(0)
				self.ui.tabelaAcoes.setText(linha, 1, qt.QString(acao["software_nomeArquivo"]))
				self.ui.tabelaAcoes.setText(linha, 2, qt.QString(acao["acao"]))
				self.ui.tabelaAcoes.setText(linha, 3, qt.QString(acao["acao_data_execucao"]))
				self.ui.tabelaAcoes.setText(linha, 4, qt.QString(acao["acao_operador"]))
				linha += 1


	def __inventario(self):
		# Exibe janela interna de inventario
		self.ui.widgetStackCentral.raiseWidget(self.ui.wStackInventario)
		
	def __log(self):
		# Exibe janela interna de log
		self.ui.widgetStackCentral.raiseWidget(self.ui.wStackLog)
		
	def __checarAtualizacoes(self):
		# Exibe janela interna de atualizacoes
		self.ui.widgetStackCentral.raiseWidget(self.ui.wStackChegarAtualizacoes)
		
	def exibe(self):
		self.ui.show()
		return self.ui


def main():
	# Inicia Log do Repositorio
	log = Log.Log("Agente")
	log = log.get()
	Ambiente.log = log
	
	# Inicia Banco de Dados
	db = SQLite.BancoDados()
	con, db = db.conectar()
	Ambiente.db = db
	Ambiente.con = con
		
	# Le as opcoes de inicializacao
	opcoes = Opcoes.Opcoes()
	try:
		op = opcoes.ler('Rede')
		servidor = op["servidor"]
		porta = int(op["porta"])
	except:
		log.error("Agente: ao buscar informacoes do servidor")
		raise
		sys.exit(1)
		
	Ambiente.servidor = servidor
	Ambiente.porta = porta
	Ambiente.mac_address = MacAddress.get(op["interface"])
	
	Ambiente.rpc = xmlrpclib.ServerProxy(Ambiente.servidorRPC)

	app = qt.QApplication(sys.argv)
	uiAgente = Interface()
	Ambiente.uiAgente = uiAgente.exibe()
	app.setMainWidget(Ambiente.uiAgente)
	app.exec_loop()
	
	# Atualizacoes
	#atualizacao = Atualizacoes.Atualizacoes()
	#atualizacao.buscar()
	
	#acao = Acoes.Acoes()
	#acao.executa(2)
	
	# Executa acao
	


if __name__ == "__main__":
	main()