#! /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 Agentes
import Repositorio
import Grupos
import Acoes
import qt
import datetime 

class UIAgentes(object):
	"""
	Classe que gerencia a interface grafica do agente, remove, adiciona, gerencia em geral agentes
	"""
	
	def __init__(self, ui):
		self.ui =ui
		
		self.agentes = Agentes.Agentes()
		self.grupos = Grupos.Grupos()
		self.repositorio = Repositorio.Repositorio()
		
		# Conecta slots
		self.ui.connect(self.ui._botaoGerenciarAgentes, qt.SIGNAL('clicked()'), self.mostrar)
		self.ui.connect(self.ui.agentes_botaoAdicionar, qt.SIGNAL('clicked()'), self.adicionar)
		self.ui.connect(self.ui.agentes_botaoProcurar, qt.SIGNAL('clicked()'), self.procurar)
		self.ui.connect(self.ui.agentes_botaoSalvar, qt.SIGNAL('clicked()'), self.salvar)
		self.ui.connect(self.ui.agentes_botaoExcluir, qt.SIGNAL('clicked()'), self.excluir)
		self.ui.connect(self.ui.agentes_botaoFechar, qt.SIGNAL('clicked()'), self.fechar)
		self.ui.connect(self.ui.agentes_botaoInstalarNovoSoftware, qt.SIGNAL('clicked()'), self.instalarNovoSoftware)
		self.ui.connect(self.ui.agentes_botaoDesinstalarSoftware, qt.SIGNAL('clicked()'), self.agendarDesinstalacao)
		self.ui.connect(self.ui.agentes_botaoInstalarSoftwareInstalados, qt.SIGNAL('clicked()'), self.softwaresInstalados)
		self.ui.connect(self.ui.agentes_botaoSoftwaresAgendarInstalacao, qt.SIGNAL('clicked()'), self.agendarInstalacao)
		self.ui.connect(self.ui.agentes_comboAcoes, qt.SIGNAL("activated(int)"), self.listarAcoes)
		self.ui.connect(self.ui.agentes_botaoAcoesRemover, qt.SIGNAL("clicked()"), self.removerAcao)
		
		self.ui.agentes_botaoFechar.setEnabled(False)
		self.__habilitarObjetosTela(False)


	def mostrar(self):
		"""
		Exibe a janela de gerenciar agentes
		"""
		# Exibe janela interna para gerenciar agentes
		self.ui.widgetStack.raiseWidget(self.ui.wStackAgente)
		self.ui.agentes_lineProcurar.setFocus()


	def adicionar(self):
		"""
		Habilita objetos para adicionar um novo agente
		"""
		self.__habilitarObjetosTela(True)
		self.ui.agentes_apelido.setFocus()
		self.ui.agentes_botaoAdicionar.setEnabled(False)
		self.ui.agentes_botaoSalvar.setEnabled(True)
		self.ui.agentes_botaoExcluir.setEnabled(False)
		self.ui.agentes_lineProcurar.setEnabled(False)
		self.ui.agentes_botaoProcurar.setEnabled(False)
		self.ui.agentes_botaoFechar.setEnabled(True)
		self.__buscarGrupos()


	def salvar(self):
		"""
		Salva informacoes editadas na janela de gerenciar agentes
		"""
		if len(self.ui.agentes_mac_address.text()) < 17:
			qt.QMessageBox.critical(None, "Gerenciamento de Agentes", qt.QString("Mac Address inválido!"))
		else:
			dicNovoAgente = {}
			dicNovoAgente["mac_address"] = str(self.ui.agentes_mac_address.text())
			dicNovoAgente["apelido"] = str(self.ui.agentes_apelido.text())
			dicNovoAgente["grupo"] = "sala 1"
			dicNovoAgente["responsavel"] = str(self.ui.agentes_responsavel.text())
			dicNovoAgente["telefone"] = str(self.ui.agentes_telefone.text())
			dicNovoAgente["setor"] = str(self.ui.agentes_setor.text())
			dicNovoAgente["localizacao"] = str(self.ui.agentes_localizacao.text())
			dicNovoAgente["observacao"] = str(self.ui.agentes_observacao.text())
			dicNovoAgente["host"] = str(self.ui.agentes_host.text())
			dicNovoAgente["processador"] = str(self.ui.agentes_processador.text())
			dicNovoAgente["memoria_ram"] = str(self.ui.agentes_memoria_ram.text())
			dicNovoAgente["disco_rigido"] = str(self.ui.agentes_disco_rigido.text())
			dicNovoAgente["drive"] = str(self.ui.agentes_drive.text())
			dicNovoAgente["rede"] = str(self.ui.agentes_rede.text())
			dicNovoAgente["fabricante"] = str(self.ui.agentes_fabricante.text())
			dicNovoAgente["numero_serial"] = str(self.ui.agentes_numero_serial.text())
			dicNovoAgente["modelo"] = str(self.ui.agentes_modelo.text())
			dicNovoAgente["grupos_nome"] = str(self.ui.agentes_comboGrupo.currentText())
			resultado = self.agentes.inseri(dicNovoAgente)
			if resultado == 1:
				qt.QMessageBox.information(None, "Gerenciamento de Agentes", qt.QString("Agente cadastrado com sucesso!"))
			else:
				resultado = self.agentes.atualiza(dicNovoAgente)
				if resultado != 1:
					qt.QMessageBox.critical(None, "Gerenciamento de Agentes", qt.QString("Falha ao cadastrar o agente.\nContate o administrador!\n" + resultado))
				else:
					qt.QMessageBox.information(None, "Gerenciamento de Agentes", qt.QString("Dados atualizados com sucesso!"))	


	def procurar(self):
		"""
		Procura agentes com o mac_address digitado pelo usuario
		"""
		if len(self.ui.agentes_lineProcurar.text()) < 17:
			self.ui.agentes_labelProcurar.setText("Mac Address inválido!");
		else:
			dicAgente = self.agentes.informacao(self.ui.agentes_lineProcurar.text())
			if dicAgente == None:
				self.ui.agentes_labelProcurar.setText("Não encontrado!");
			else:
				self.__habilitarObjetosTela(True)
				self.ui.agentes_botaoAdicionar.setEnabled(False)
				self.ui.agentes_botaoSalvar.setEnabled(True)
				self.ui.agentes_botaoExcluir.setEnabled(True)
				self.__preencherAgente(dicAgente)
				self.ui.agentes_botaoFechar.setEnabled(True)
				
				# Procura softwares instalados no agente
				dicSoftwares = self.agentes.softwaresInstalados(dicAgente["mac_address"])
				linha = 0
				if dicSoftwares == -1:
					qt.QMessageBox.critical(None, "Gerenciamento de Agentes", qt.QString("Falha ao procurar softwares instalados!\nContate o administrador!"))
				else:
					self.ui.agentes_tabelaSoftwaresInstalados.setEnabled(True)
					for s in dicSoftwares:
						sw= self.repositorio.informacao(s["softwares_md5"])
						if sw != -1:
							self.ui.agentes_tabelaSoftwaresInstalados.insertRows(self.ui.agentes_tabelaSoftwaresInstalados.numRows(), 1)
							nome = sw["nome"] + "-" + sw["versao"] + "-" + sw["liberacao"]
							self.ui.agentes_tabelaSoftwaresInstalados.setText(linha, 0, qt.QString(nome))
							self.ui.agentes_tabelaSoftwaresInstalados.setText(linha, 1, qt.QString(str(sw["tamanho"])))
							self.ui.agentes_tabelaSoftwaresInstalados.setText(linha, 2, qt.QString(sw["grupo"]))
							self.ui.agentes_tabelaSoftwaresInstalados.setText(linha, 3, qt.QString(sw["descricao"]))
							self.ui.agentes_tabelaSoftwaresInstalados.setText(linha, 4, qt.QString(sw["plataforma"]))
							self.ui.agentes_tabelaSoftwaresInstalados.setText(linha, 5, qt.QString(sw["md5"]))
							linha += 1
						else:
							QMessageBox.critical(None, "Gerenciamento de Agentes", qt.QString("Falha ao procurar informações do software:\n" + s["softwares_md5"] + "\nContate o administrador!"))
				
				# Procura por softwares nao instalados
				dicSoftwaresNaoInstalados = self.agentes.softwaresNaoInstalados(self.ui.agentes_mac_address.text())
				linha = 0
				if dicSoftwaresNaoInstalados == -1:
					qt.QMessageBox.critical(None, "Gerenciamento de Agentes", qt.QString("Falha ao buscar softwares disponíveis!\nContate o administrador!\n" + dicSoftwaresNaoInstalados))
				elif  dicSoftwaresNaoInstalados == None:
					qt.QMessageBox.information(None, "Gerenciamento de Agentes", qt.QString("Nenhum software disponivel no momento!"))
				else:
					for sw in dicSoftwaresNaoInstalados:
						self.ui.agentes_tabelaSoftwaresDisponiveis.insertRows(self.ui.agentes_tabelaSoftwaresDisponiveis.numRows(), 1)
						nome = sw["nome"] + "-" + sw["versao"] + "-" + sw["liberacao"]
						self.ui.agentes_tabelaSoftwaresDisponiveis.setText(linha, 0, qt.QString(nome))
						self.ui.agentes_tabelaSoftwaresDisponiveis.setText(linha, 1, qt.QString(str(sw["tamanho"])))
						self.ui.agentes_tabelaSoftwaresDisponiveis.setText(linha, 2, qt.QString(sw["grupo"]))
						self.ui.agentes_tabelaSoftwaresDisponiveis.setText(linha, 3, qt.QString(sw["descricao"]))
						self.ui.agentes_tabelaSoftwaresDisponiveis.setText(linha, 4, qt.QString(sw["plataforma"]))
						self.ui.agentes_tabelaSoftwaresDisponiveis.setText(linha, 5, qt.QString(sw["md5"]))
						linha += 1
				# Atualiza lista de acoes
				self.listarAcoes()


	def removerAcao(self):
		"""
		Remove acao do agente
		"""
		linha = self.ui.agentes_tabelaAcoes.currentRow()
		if linha == -1:
			qt.QMessageBox.information(None, "Gerenciamento de Agentes", qt.QString("Selecione a ação a ser removida."))
		else:
			acao = Acoes.Acoes(self.ui.agentes_mac_address.text())
			id =  self.ui.agentes_tabelaAcoes.text(linha, 0)
			resultado = acao.removeAcao(id)
			if resultado == 1:
				qt.QMessageBox.information(None, "Gerenciamento de Agentes", qt.QString("Acao removida com sucesso!"))
				self.listarAcoes(1)
			else:
				qt.QMessageBox.critical(None, "Gerenciamento de Agentes", qt.QString("Falha ao remover ação do agente!\nContate o administrador!\n" + resultado))
 

	def listarAcoes(self, opcao=None):
		"""
		Preenche a tabela de acoes, de acordo com a opcao passada
		Entrada:
			opcao = { 'todas', 'agendadas', 'executadas' }
		"""
		if opcao != None:
			opcao = int(self.ui.agentes_comboAcoes.currentItem())
			if opcao == 0:
				opcao = "agendada"
			elif opcao == 1:
				opcao = "executada"
			elif opcao == 2:
				opcao = None
		acoes = Acoes.Acoes(self.ui.agentes_mac_address.text())
		resultado = acoes.informacao(status=opcao)
		if resultado == -1:
			qt.QMessageBox.critical(None, "Gerenciamento de Agentes", qt.QString("Falha ao buscar ações do agente!\nContate o administrador!\n" + resultado))
		else:
			self.ui.agentes_tabelaAcoes.setNumRows(0)
			self.ui.agentes_botaoAcoesRemover.setEnabled(True)
			linha = 0
			for acao in resultado:
				self.ui.agentes_tabelaAcoes.insertRows(linha, 1)
				self.ui.agentes_tabelaAcoes.setText(linha, 0, qt.QString(str(acao["id"])))
				self.ui.agentes_tabelaAcoes.setText(linha, 1, qt.QString(acao["acao"]))
				self.ui.agentes_tabelaAcoes.setText(linha, 2, qt.QString(acao["softwares_md5"]))
				self.ui.agentes_tabelaAcoes.setText(linha, 3, qt.QString(str(acao["data_criacao"])))
				self.ui.agentes_tabelaAcoes.setText(linha, 4, qt.QString(str(acao["data_execucao"])))
				self.ui.agentes_tabelaAcoes.setText(linha, 5, qt.QString(acao["observacao"]))
				self.ui.agentes_tabelaAcoes.setText(linha, 6, qt.QString(acao["softwares_md5"]))
				self.ui.agentes_tabelaAcoes.setText(linha, 7, qt.QString(acao["operadores_login"]))
				linha += 1
		

	def fechar(self):
		"""
		Desabilita e limpa os objetos da janela de gerenciar agentes
		"""
		self.ui.agentes_botaoAdicionar.setEnabled(True)
		self.ui.agentes_botaoSalvar.setEnabled(False)
		self.ui.agentes_botaoExcluir.setEnabled(False)
		self.ui.agentes_botaoProcurar.setEnabled(True)
		self.ui.agentes_lineProcurar.setEnabled(True)
		self.__habilitarObjetosTela(False)
		self.ui.agentes_botaoFechar.setEnabled(False)
		self.ui.agentes_lineProcurar.setFocus()
		self.softwaresInstalados()


	def excluir(self):
		"""
		Trata o botao excluir
		"""
		# Remove agente...
		removeAgente = self.agentes.remove(self.ui.agentes_mac_address.text())
		if removeAgente == 1:
			qt.QMessageBox.information(None, "Gerenciamento de Agentes", qt.QString("Agente removido com sucesso!"))
		else:
			qt.QMessageBox.critical(None, "Gerenciamento de Agentes", qt.QString("Falha ao remover o agente: " + str(self.ui.agentes_mac_address.text()) + ".\nContate o administrador!"))
		self.__habilitarObjetosTela(False)
		self.ui.agentes_botaoAdicionar.setEnabled(True)
		self.ui.agentes_botaoSalvar.setEnabled(False)
		self.ui.agentes_botaoProcurar.setEnabled(True)
		self.ui.agentes_botaoAdicionar.setEnabled(True)
		self.ui.agentes_botaoExcluir.setEnabled(False)
		self.ui.agentes_botaoFechar.setEnabled(False)


	def softwaresInstalados(self):
		"""
		Cancela a instalacao de um novo software no agente, mas nao apaga os dados da tela
		"""
		self.ui.agentes_widgetStackSoftwares.raiseWidget(self.ui.agentes_wStackSoftwaresInstalados)

	
	def agendarDesinstalacao(self):
		"""
		Agenda a desinstalacao de um software ja instalado no agente
		"""
		linha = self.ui.agentes_tabelaSoftwaresInstalados.currentRow()
		
		if linha == -1:
			qt.QMessageBox.information(None, "Gerenciamento de Agentes", qt.QString("Selecione o software a ser desinstalado."))
		else:
			sw_md5 = str(self.ui.agentes_tabelaSoftwaresInstalados.text(linha, 5))
			dataIndicada = datetime.date.today()
			acao = { "softwares_md5" : sw_md5, "data_execucao" : dataIndicada, "observacao" : "desinstalar", "agentes_mac_address" : str(self.ui.agentes_mac_address.text())}
			acoes = Acoes.Acoes(self.ui.agentes_mac_address.text())
			print acao
			resposta = acoes.desinstala(acao)
			if resposta != 1:
				qt.QMessageBox.critical(None, "Gerenciamento de Agentes", qt.QString("Falha ao agendar nova desinstalacao!\n" + str(resposta)))
			else:
				qt.QMessageBox.information(None, "Gerenciamento de Agentes", qt.QString("Desinstalacao agendada com sucesso!"))	
				# Atualiza lista de acoes
				self.listarAcoes()

	def agendarInstalacao(self):
		"""
		Agenda a instalacao de um novo software
		"""
		linha = self.ui.agentes_tabelaSoftwaresDisponiveis.currentRow()
		
		if linha == -1:
			qt.QMessageBox.information(None, "Gerenciamento de Agentes", qt.QString("Selecione o software a ser instalado."))
		else:
			novo_sw_md5 = self.ui.agentes_tabelaSoftwaresDisponiveis.text(linha, 5)
			dataIndicada = self.ui.agentes_dateSoftwaresDataMaximaExecucao.date()
			dataIndicada = str(dataIndicada.year()) + "/" + str(dataIndicada.month()) + "/" + str(dataIndicada.day())
			observacao = self.ui.agentes_textSoftwaresInstalacaoObservacao.text()
			acao = { "softwares_md5" : novo_sw_md5, "data_execucao" : dataIndicada, "observacao" : observacao, "agentes_mac_address" : self.ui.agentes_mac_address.text()}
			acoes = Acoes.Acoes(self.ui.agentes_mac_address.text())
			resposta = acoes.instala(acao)
			if resposta != 1:
				qt.QMessageBox.critical(None, "Gerenciamento de Agentes", qt.QString("Falha ao agendar nova instalação!\n" + str(resposta)))
			else:
				qt.QMessageBox.information(None, "Gerenciamento de Agentes", qt.QString("Instalação agendada com sucesso!"))	
				# Atualiza lista de acoes
				self.listarAcoes()


	def instalarNovoSoftware(self):
		"""
		Exibe a tela de softwares disponiveis para instalacao
		"""
		self.ui.agentes_widgetStackSoftwares.raiseWidget(self.ui.agentes_wStackSoftwaresInstalarNovo)
		dataIndicada = datetime.date.today() + datetime.timedelta(days=30)
		self.ui.agentes_dateSoftwaresDataMaximaExecucao.setDate(qt.QDate(dataIndicada.year, dataIndicada.month, dataIndicada.day))


	def __buscarGrupos(self):
		gruposAtivos = self.grupos.informacao()
		if gruposAtivos != -1:
			for grp in gruposAtivos:
				self.ui.agentes_comboGrupo.insertItem(qt.QString(grp["nome"]))
		else:
			print "falha ao buscar grupos"
	
	
	def __preencherAgente(self, dicAgente):
		self.ui.agentes_mac_address.setText(dicAgente["mac_address"])
		self.ui.agentes_apelido.setText(dicAgente["apelido"])
		self.ui.agentes_localizacao.setText(dicAgente["localizacao"])
		self.ui.agentes_responsavel.setText(dicAgente["responsavel"])
		self.ui.agentes_setor.setText(dicAgente["setor"])
		self.ui.agentes_processador.setText(dicAgente["processador"])
		self.ui.agentes_memoria_ram.setText(dicAgente["memoria_ram"])
		self.ui.agentes_disco_rigido.setText(dicAgente["disco_rigido"])
		self.ui.agentes_fabricante.setText(dicAgente["fabricante"])
		self.ui.agentes_modelo.setText(dicAgente["modelo"])
		self.ui.agentes_numero_serial.setText(dicAgente["numero_serial"])
		self.ui.agentes_host.setText(dicAgente["host"])
		self.ui.agentes_telefone.setText(dicAgente["telefone"])
		self.ui.agentes_observacao.setText(dicAgente["observacao"])
		self.ui.agentes_drive.setText(dicAgente["drive"])
		self.ui.agentes_rede.setText(dicAgente["rede"])
		self.__buscarGrupos()
		self.ui.agentes_comboGrupo.setCurrentText(qt.QString(dicAgente["grupos_nome"]))


	def __habilitarObjetosTela(self, opcao=True):
		self.ui.agentes_tabWidget.setEnabled(True)
		self.ui.agentes_tabHardware.setEnabled(True)
		self.ui.agentes_tabInformacoes.setEnabled(True)
		
		self.ui.agentes_lineProcurar.setText("");
		self.ui.agentes_labelProcurar.setText("");
		self.ui.agentes_labelProcurar.clear()
		
		# Tab informacoes
		self.ui.agentes_apelido.setEnabled(opcao)
		self.ui.agentes_apelido.clear()
		self.ui.agentes_comboGrupo.setEnabled(opcao)
		self.ui.agentes_comboGrupo.clear()
		self.ui.agentes_responsavel.setEnabled(opcao)
		self.ui.agentes_responsavel.clear()
		self.ui.agentes_telefone.setEnabled(opcao)
		self.ui.agentes_telefone.clear()
		self.ui.agentes_setor.setEnabled(opcao)
		self.ui.agentes_setor.clear()
		self.ui.agentes_localizacao.setEnabled(opcao)
		self.ui.agentes_localizacao.clear()
		self.ui.agentes_observacao.setEnabled(opcao)
		self.ui.agentes_observacao.clear()
		self.ui.agentes_host.setEnabled(opcao)
		self.ui.agentes_host.clear()
		self.ui.agentes_mac_address.setEnabled(opcao)
		self.ui.agentes_mac_address.clear()

		# Tab hardware
		self.ui.agentes_processador.setEnabled(opcao)
		self.ui.agentes_processador.clear()
		self.ui.agentes_disquete.setEnabled(opcao)
		self.ui.agentes_disquete.setChecked(0)
		self.ui.agentes_memoria_ram.setEnabled(opcao)
		self.ui.agentes_memoria_ram.clear()
		self.ui.agentes_disco_rigido.setEnabled(opcao)
		self.ui.agentes_disco_rigido.clear()
		self.ui.agentes_drive.setEnabled(opcao)
		self.ui.agentes_drive.clear()
		self.ui.agentes_rede.setEnabled(opcao)
		self.ui.agentes_rede.clear()
		self.ui.agentes_fabricante.setEnabled(opcao)
		self.ui.agentes_fabricante.clear()
		self.ui.agentes_numero_serial.setEnabled(opcao)
		self.ui.agentes_numero_serial.clear()
		self.ui.agentes_modelo.setEnabled(opcao)
		self.ui.agentes_modelo.clear()
		
		# Tab softwares
		self.ui.agentes_tabelaSoftwaresInstalados.setNumRows(0)
		self.ui.agentes_tabelaSoftwaresInstalados.removeRow(0)
		self.ui.agentes_tabelaSoftwaresInstalados.setEnabled(opcao)
		self.ui.agentes_botaoInstalarNovoSoftware.setEnabled(opcao)
		self.ui.agentes_botaoDesinstalarSoftware.setEnabled(opcao)
		
		# Tab instalacoes softwares (widget softwares)
		self.ui.agentes_tabelaSoftwaresDisponiveis.setNumRows(0)
		self.ui.agentes_tabelaSoftwaresDisponiveis.removeRow(0)
		self.ui.agentes_tabelaSoftwaresDisponiveis.setEnabled(opcao)
		self.ui.agentes_textSoftwaresInstalacaoObservacao.clear()
		self.ui.agentes_botaoInstalarSoftwareInstalados.setEnabled(opcao)
		self.ui.agentes_botaoSoftwaresAgendarInstalacao.setEnabled(opcao)
		
		# Tab acoes
		self.ui.agentes_tabelaAcoes.setNumRows(0)
		self.ui.agentes_tabelaAcoes.setEnabled(opcao)
		self.ui.agentes_comboAcoes.setEnabled(opcao)
		self.ui.agentes_botaoAcoesRemover.setEnabled(opcao)

