#!/usr/bin/env python
# encoding: iso-8859-15
#
#Minë. Mundo Interactivo-Narrativo en Español [Tierra-Media]
#Copyright (C) 2002  Pablo Ruiz Múzquiz
#
#
#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
#
#
#Fichero: item.py

"""Clase Item."""


from xml.dom import minidom
import random
import sys
import string
import os

from utils import *
from bloquedialogo import *
from fragmento import *

class Item(BloqueDialogo):
    """Secuencia de texto que se presenta al activar un tema de la conversación.
    
    Contiene los siguientes atributos:
     - _tema: tema en el que está contenido este item
     - _relacionados: diccionario con los contextos de los temas relacionados con este item, indexados por nombre del tema
     - _fragmentos: lista de bloques de texto.
    
    Invariantes:
      _tema != None
      _relacionados != None

    """
    REPETICIONES_INFINITAS = -1
    
    def __init__(self, item_xml, tema):
	"""Crea un item nuevo a partir de un arbol XML de descripción de item.
	
	  item_xml: corresponde con un nodo DOM de tema
	  tema != None
	"""
	
	self._tema = tema
	self._limpiar_comentarios(item_xml)
	self._fragmentos = self._parsear_fragmentos(item_xml)
	self._relacionados = self._parsear_temas_relacionados(item_xml)
	self._requisitos = self._parsear_requisitos(item_xml)
	self._repeticiones = 0
	self._comando = "preguntar"
	
	if item_xml.getAttribute("comando"):
	   self._comando = item_xml.getAttribute("comando")
	if item_xml.getAttribute("repeticiones"):
	   if item_xml.getAttribute("repeticiones") == "si":
	        self._repeticiones = self.REPETICIONES_INFINITAS
	   else:
	        self._repeticiones = string.atoi(item_xml.getAttribute("repeticiones"))
	
    def tema(self):
        return self._tema
    
    def relacionados(self):
        return self._relacionados
    
    def relacionado(self, nombretema):
        """Devuelve el nombre del contexto que contiene el tema, si éste se encuentra relacionado con este item."""
        if self._relacionados.has_key(nombretema):
            return self._relacionados[nombretema]
        else:
            return ""
    
    def satisfecho_en(self, visita):
        """Determina si los requisitos de este item se cumplen en esa visita"""	
	
	for requisito in self._requisitos:
	    if type(self._requisitos[requisito]) == type(""):
	        # Requisito de tipo string
	        if not visita.hito(requisito) == self._requisitos[requisito]:
	                return 0
	    elif not self._requisitos[requisito]:
	        # Antirequisito 
	        if visita.hito(requisito):
	                return 0
	    else:
	        # Requisito con nodo de texto
	        if not visita.hito(requisito) == self._requisitos[requisito].mensaje_formateado(visita):
		        return 0
        return 1
        
    def repeticiones(self):
        return self._repeticiones
    
    def __str__(self):
        texto = "\t\t<Item -\n\t\t\tTexto:\n"
        for fragmento in self._fragmentos:
            texto = texto + "\t\t\t" + str(fragmento) + "\n"
        texto = texto + "\t\t\tRelacionados:\n"
        for tema in self._relacionados.keys():
            texto = texto + "\t\t\t" + self._relacionados[tema] + "." + tema + "\n"
        texto = texto + "\t\t/>\n"
        return texto

# Código para pruebas unitarias del módulo.

if (__name__ == '__main__'):
    archivo = os.path.join(BloqueDialogo.DIR_DESC_DIALOGOS, "tutor",  "tutor-cortesia" + BloqueDialogo.EXT_DESC_DIALOGOS)
    print archivo
    stream = open(archivo)
    doc_xml = minidom.parse(stream).documentElement
    aux = doc_xml.getElementsByTagName("tema")[0].getElementsByTagName("item")[0]
    
    item = Item(aux, None)
    stream.close()

    print "Item cargado correctamente.\n" + str(item) # + item._fragmentos[0].mensaje_formateado(None) 
